брошен)
аюсь закодировать решение, в котором один поток создает задачи с интенсивным вводом-выводом, которые могут выполняться параллельно. Каждая задача имеет значительные данные в памяти. Поэтому я хочу иметь возможность ограничить количество задач, ожидающих в данный момент.
Если я создаю 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 лет после постановки вопроса)
Для тех, кто читает этот вопрос и ответы на него, не принимайте принятый ответ как одно правильное решение. Пожалуйста, прочитайте все ответы и комментарии.