Я написал пример кода:Почему threadpool создает только один поток?
class Test {
public static void main(String[] args) throws InterruptedException {
ThreadPoolExecutor executorService = new ThreadPoolExecutor(0, 100,
2L, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>());
executorService.allowCoreThreadTimeOut(true);
CountDownLatch countDownLatch = new CountDownLatch(20);
long l = System.currentTimeMillis();
for (int i = 0; i < 20; i++) {
Thread.sleep(100);
executorService.submit(new Runnable() {
@Override
public void run() {
try {
countDownLatch.countDown();
Thread.sleep(500);
} catch (Exception e) {
System.out.println(e);
}
}
});
}
executorService.shutdown();
countDownLatch.await();
System.out.println((System.currentTimeMillis() - l)/100);
}
}
Каждые 100 мс представляет новую задачу (общее количество задач - 20). Продолжительность каждой задачи - 0,5 сек. Таким образом, 5 задача может быть выполнена параллельно и лучшее время выполнения будет: 20 * 100 + 500 = 2,5 сек и пул должен создать 5 темы
Но мой опыт показывает, 9,6 сек.
Я открыл jsvisualvm
, чтобы увидеть, сколько потоков пула создает и я вижу, что только один поток был создан:
, пожалуйста, поправьте где моя конфигурация threadPooll неправильно.
Кажется, что сегодня мы составляем отличную команду ;-) ... больше вопросов, чтобы прийти с вашей стороны? И просто из любопытства: в прошлый раз вы поддержали и приняли; на этот раз просто принять; есть ли более глубокая логика? – GhostCat
Я не понимаю, почему, если я использую SynchronousQueue в моем примере - используется только один поток, но в случае newCachedThreadPool (он использует SynchrounousQueue внутри) - количество потоков отличается от 1 – gstackoverflow
. Для этой части, вероятно, придется точно посмотреть на исходный код. Возможно, код, предоставленный «фабрикой», использует немного отличающийся класс очереди; там какая-то тонкая разница. – GhostCat