Я пытаюсь закодировать решение, в котором один поток создает задачи с интенсивным вводом-выводом, которые могут выполняться параллельно. Каждая задача имеет важные данные в памяти. Поэтому я хочу иметь возможность ограничивать количество задач, ожидающих выполнения в данный момент.
Если я создам ThreadPoolExecutor следующим образом:
ThreadPoolExecutor executor = new ThreadPoolExecutor(numWorkerThreads, numWorkerThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(maxQueue));
Потом executor.submit(callable)
выкидывает, RejectedExecutionException
когда очередь заполняется и все потоки уже заняты.
Что я могу сделать, чтобы executor.submit(callable)
заблокировать, когда очередь заполнена и все потоки заняты?
РЕДАКТИРОВАТЬ : Я пробовал это :
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
И это в некоторой степени обеспечивает эффект, которого я хочу достичь, но неэлегантным способом (в основном отклоненные потоки запускаются в вызывающем потоке, поэтому это блокирует вызывающий поток от отправки большего количества).
РЕДАКТИРОВАТЬ: (5 лет после того, как задали вопрос)
Всем, кто читает этот вопрос и ответы на него, не принимайте принятый ответ как одно правильное решение. Пожалуйста, прочтите все ответы и комментарии.