java - 为什么Executors创建Executor使用LinkedBlockingQueue而不是ConcurrentLinkedQueue

标签 java concurrency locking java.util.concurrent

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/

相关文章:

python - 多个线程在 Python 中同时写入日志文件

c - 同时访问文件。奇怪的锁定行为

java - 为什么我们不能在私有(private)锁的情况下获取锁?

multithreading - 这会使对象线程安全吗?

Java:使前缀树记住最后一个不为空的值

java - 没有从我的自定义 Cordova 插件 (Android) 获取回调

java - LinkedIn 集成 - 建立 requestToken

java - 服务器向客户端发送文件java

haskell - TVar 和 TMVar 之间的区别

multithreading - 如何在 JavaFX 中实时更新 textarea(console) 而不会丢失流量或卡住应用程序