ThreadPoolExecutor с ConcurrentLinkedQueue

Могу ли я передать неблокирующую очередь с именем ConcurrentLinkedQueue в ThreadPoolExecutor вместо LinkedBlockingQueue (или любой другой блокирующей очереди)?


person ahmad raza    schedule 07.01.2015    source источник
comment
Я думаю, что технически да, но в зависимости от требований будет определено, используете ли вы блокирующую или неблокирующую очередь.   -  person kosa    schedule 07.01.2015
comment
Два встречных вопроса к вам: Почему вы хотите это сделать? Что происходит, когда вы пытаетесь это сделать?   -  person dcsohl    schedule 07.01.2015
comment
Конструктор специально указывает, что очередь должна быть BlockingQueue, причины можно найти в самом коде ThreadPoolExecutor.   -  person Ordous    schedule 07.01.2015


Ответы (2)


Нет, документация (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html) указывает, что необходимо использовать блокирующую очередь.

Пожалуйста, обратитесь к разделу очереди.

person alampada    schedule 07.01.2015

Как сказал Антонис, вы должны использовать очередь блокировки. Причина этого в том, что когда очередь становится пустой, пул должен блокироваться и ждать новых задач. Вместо повторной реализации этой логики блокировки в самом исполнителе пула разработчики использовали BlockingQueue.

Однако, поскольку ConcurrentLinkedQueue реализует Collection, вы можете сделать это:

ConcurrentLinkedQueue<Thing> nonBlocking = new ConcurrentLinkedQueue<>();
// Do work, enqueue things
LinkedBlockingQueue<Thing> blocking = new LinkedBlockingQueue<>(nonBlocking);
person Floegipoky    schedule 07.01.2015