Я пытаюсь выполнить множество задач с помощью ThreadPoolExecutor. Ниже приведен гипотетический пример:Блок ThreadPoolExecutor, когда очередь заполнена?
def workQueue = new ArrayBlockingQueue<Runnable>(3, false)
def threadPoolExecutor = new ThreadPoolExecutor(3, 3, 1L, TimeUnit.HOURS, workQueue)
for(int i = 0; i < 100000; i++)
threadPoolExecutor.execute(runnable)
Проблема заключается в том, что я быстро получить java.util.concurrent.RejectedExecutionException, так как число задач превышает размер очереди. Тем не менее, желаемое поведение, которое я ищу, состоит в том, чтобы иметь блок основного потока, пока в очереди не будет места. Каков наилучший способ сделать это?
Взгляните на этот вопрос: http://stackoverflow.com/questions/2001086/how-to-make-threadpoolexecutors-submit-method-block-if-it-is-saturated – Kiril
[Этот ответ] (http : //stackoverflow.com/a/4522411/394431) на другой вопрос предлагает использовать пользовательский подкласс BlockingQueue, который блокирует 'offer()' делегированием 'put()'. Я думаю, что он работает более или менее так же, как 'RejectedExecutionHandler', который вызывает' getQueue(). Put() '. –
Ввод непосредственно в очередь будет неправильным, как объяснено в этом ответе http://stackoverflow.com/a/3518588/585903 –