брошен)

аюсь закодировать решение, в котором один поток создает задачи с интенсивным вводом-выводом, которые могут выполняться параллельно. Каждая задача имеет значительные данные в памяти. Поэтому я хочу иметь возможность ограничить количество задач, ожидающих в данный момент.

Если я создаю 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 лет после постановки вопроса)

Для тех, кто читает этот вопрос и ответы на него, не принимайте принятый ответ как одно правильное решение. Пожалуйста, прочитайте все ответы и комментарии.

Ответы на вопрос(0)

Ваш ответ на вопрос