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