Java: ExecutorService, который блокируется при отправке после определенный размер очереди

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

Если я создам ThreadPoolExecutor следующим образом:

    ThreadPoolExecutor executor = new ThreadPoolExecutor(numWorkerThreads, numWorkerThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue(maxQueue));

Затем исполнитель . submit (callable) выбрасывает RejectedExecutionException , когда очередь заполняется и все потоки уже заняты.

Что я могу сделать, чтобы блокировать executor.submit (callable) , когда очередь заполнена и все потоки заняты?

EDIT : Я пробовал это :

executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

И это в некоторой степени дает эффект, которого я хочу достичь, но неэлегантным способом (в основном отклоненные потоки запускаются в вызывающем потоке, поэтому это блокирует вызывающий поток от отправки большего количества).

РЕДАКТИРОВАТЬ: (5 лет после того, как задан вопрос)

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

73
задан rogerdpack 27 July 2017 в 02:59
поделиться