是否可以将名为ConcurrentLinkedQueue的非阻塞队列传递给ThreadPoolExecutor而不是LinkedBlockingQueue(或任何其他阻塞队列)?
发布于 2015-01-08 00:22:36
不,文档(http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html)指出需要使用阻塞队列。
请参阅排队部分。
发布于 2015-01-08 00:59:01
正如antonis所说,您必须使用阻塞队列。这是因为当队列变空时,池必须阻塞并等待更多任务。开发人员利用了BlockingQueue,而不是在池执行器本身中重新实现这种阻塞逻辑。
但是,由于ConcurrentLinkedQueue实现了Collection,因此您可以这样做:
ConcurrentLinkedQueue<Thing> nonBlocking = new ConcurrentLinkedQueue<>();
// Do work, enqueue things
LinkedBlockingQueue<Thing> blocking = new LinkedBlockingQueue<>(nonBlocking);https://stackoverflow.com/questions/27823287
复制相似问题