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