Могу ли я передать неблокирующую очередь с именем ConcurrentLinkedQueue
в ThreadPoolExecutor
вместо LinkedBlockingQueue
(или любой другой блокирующей очереди)?
ThreadPoolExecutor с ConcurrentLinkedQueue
Ответы (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
BlockingQueue
, причины можно найти в самом кодеThreadPoolExecutor
. - person Ordous   schedule 07.01.2015