public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
使用LinkedBlockingQueue,但是ConcurrentLinkedQueue应该更高效,这是无阻塞和无锁的?
最佳答案
答案很简单:ConcurrentLinkedQueue
不是 BlockingQueue
,但 LinkedBlockingQueue
是。 ThreadPoolExecutor
constructors期望 BlockingQueue
,以便 Executors
也可以使用 BlockingQueue
的其他实现(例如 SynchronousQueue
或 )创建实例ArrayBlokingQueue
(取决于您在Executors
中调用的工厂方法)。
因此,更普遍的问题是:为什么是 BlockingQueue
而不是简单的 Queue
。答案也很简单:BlockingQueue
接口(interface)有更多有用的方法。例如,一个方法告诉是否可以在不违反容量限制的情况下将元素插入队列中(并且不抛出异常,检查 BlockingQueue.offer()
)。或者,如果队列没有元素(队列又具有定时的 poll() 而不是定时的 take() 版本),则某些方法会阻塞。因此,如果您检查 ThreadPoolExecutor 的实现,您会发现它调用了 Queue
接口(interface)中缺少的这些便捷方法。
关于java - 为什么Executors创建Executor使用LinkedBlockingQueue而不是ConcurrentLinkedQueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32265928/