Код: Выделить всё
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;
}
}
Насколько я понимаю, он должен увеличить свой пул потоков с 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());
Код: Выделить всё
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)?