У меня есть код ниже:
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
10, // corePoolSize
10, // maximumPoolSize
10, // keepAliveTime
TimeUnit.SECONDS,
new LinkedBlockingQueue<>()
);
final List<Callable<MyResponse>> tasks = new ArrayList<>();
final CountDownLatch latch = new CountDownLatch(concurrency);
for (int i = 0; i < 50; i++) {
tasks.add(() -> {
latch.countDown();
latch.await();
return getResponse(); // Returns a MyResponse object.
});
}
final List<Future<ThrottleResponse>> futures = threadPoolExecutor.invokeAll(tasks);
Есть 50 задач, но доступно только 10 потоков.Исходя из результатов моих тестов, выполнение кода занимает вечность, чего я не понимаю.
Что происходит с методом invokeAll
?Есть ли в этом коде мертвая блокировка и почему?Я думаю, что threadPoolExecutor
будет помещать отложенные задачи в LinkedBlockingQueue
и опрашивать их в очереди для выполнения задач, так что не должно быть мертвой блокировки, верно?