Почему ThreadPoolExecutor запускает только один поток? [дубликат]JAVA

Программисты JAVA общаются здесь
Anonymous
Почему ThreadPoolExecutor запускает только один поток? [дубликат]

Сообщение Anonymous »

У меня есть следующий класс:

Код: Выделить всё

package threading.threadpools.threaddeath;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

abstract class TestThreadPoolExecutor {
private TestThreadPoolExecutor() {}

static public ThreadPoolExecutor create() {
return new ThreadPoolExecutor(0, 10, 60, TimeUnit.SECONDS, new LinkedBlockingQueue());
}

static private final long START_TIME_MS = System.currentTimeMillis();

static public void main(final String... args) {
final ThreadPoolExecutor x = create();
testNormalBehavior(x);
}

static private void testNormalBehavior(final ThreadPoolExecutor x) {
final int MAX = 5;
for (int i = 0; i < MAX; i++) {
final int index = i;
final Runnable r = () -> {
System.out.println(nowMs() + "\t" + index + "\t" + "Start" + ", Thread name: " + Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (final InterruptedException e) {
e.printStackTrace();
}
System.out.println(nowMs() + "\t" + index + "\t" + "End");
};
System.out.println(nowMs() + "\t" + index + "\t" + "Submitting...");
x.submit(r);
}
System.out.println(nowMs() + "\t" + "CREATOR done.");
}

static private long nowMs() {
return System.currentTimeMillis() - START_TIME_MS;
}

}

Там я создаю ThreadPoolExecutor с 0 постоянными и 10 максимальными потоками.
Насколько я понимаю, он должен увеличить свой пул потоков с 0 до необходимого количества задач, но с максимальным числом 10 потоков параллельно.
Но затем я запускаю пример в Java 8 или Java 25, я получаю этот вывод, который говорит мне, что работает только один поток, последовательно отрабатывая поставленные задачи.
Выход:

Код: Выделить всё

97  0   Submitting...
99  1   Submitting...
99  2   Submitting...
99  3   Submitting...
99  4   Submitting...
99  CREATOR done.
100 0   Start, Thread name: pool-1-thread-1
1100    0   End
1100    1   Start, Thread name: pool-1-thread-1
2101    1   End
2101    2   Start, Thread name: pool-1-thread-1
3102    2   End
3102    3   Start, Thread name: pool-1-thread-1
4103    3   End
4103    4   Start, Thread name: pool-1-thread-1
5105    4   End
Когда я меняю строку на

Код: Выделить всё

        return new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS, new LinkedBlockingQueue());
(используя [5 == количество задач] или любое число больше 5), я получаю ожидаемый результат с первым параметром 0 или 1:

Код: Выделить всё

81  0   Submitting...
82  1   Submitting...
82  2   Submitting...
83  3   Submitting...
83  4   Submitting...
83  CREATOR done.
84  0   Start, Thread name: pool-1-thread-1
84  2   Start, Thread name: pool-1-thread-3
84  4   Start, Thread name: pool-1-thread-5
86  1   Start, Thread name: pool-1-thread-2
86  3   Start, Thread name: pool-1-thread-4
1084    0   End
1100    1   End
1110    4   End
1110    2   End
1111    3   End
Так почему же эта штука запускает только один поток?
Это ошибка или заблуждение с моей стороны?
Есть ли альтернативы этому, которые уменьшают размер неиспользуемого пула потоков обратно до 0, когда он не нужен? (За исключением реализации моего собственного ExecutorService)?

Вернуться в «JAVA»