带有ConcurrentLinkedQueue的ThreadPoolExecutor

时间:2015-01-07 15:53:25

标签: java threadpoolexecutor

我是否可以将名为ConcurrentLinkedQueue的非阻塞队列传递给ThreadPoolExecutor而不是LinkedBlockingQueue(或任何其他阻塞队列)?

2 个答案:

答案 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);