我是否可以将名为ConcurrentLinkedQueue
的非阻塞队列传递给ThreadPoolExecutor
而不是LinkedBlockingQueue
(或任何其他阻塞队列)?
答案 0 :(得分:0)
不,文档(http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html)声明需要使用阻塞队列。
请参阅排队部分。
答案 1 :(得分:0)
正如antonis所说,你必须使用阻塞队列。原因是当队列变空时,池必须阻塞并等待更多任务。开发人员不是在池执行器本身中重新实现此阻塞逻辑,而是使用BlockingQueue
。
但是,由于ConcurrentLinkedQueue
实现了Collection
,您可以执行此操作:
ConcurrentLinkedQueue<Thing> nonBlocking = new ConcurrentLinkedQueue<>();
// Do work, enqueue things
LinkedBlockingQueue<Thing> blocking = new LinkedBlockingQueue<>(nonBlocking);