【问题标题】:Blocking queue method in concurrent package;并发包中的阻塞队列方法;
【发布时间】:2013-07-16 13:21:22
【问题描述】:

想知道为什么method drainTo 只出现在并发收集框架中(特别是BlockingQueue)而不是常规收集框架中。有什么理由吗? 提前致谢。

【问题讨论】:

标签: java concurrency queue blockingqueue


【解决方案1】:

像往常一样,如果不问课程的作者本人,就很难说出来。但我们可以做出一些有根据的猜测。

javadoc 声明:

从此队列中删除所有可用元素并将它们添加到给定集合中。此操作可能比重复轮询此队列更有效。

所以根本原因可能是为了效率。

drainTo 本质上等同于(在单线程环境中,为简单起见):

while ((e = queue.poll()) != null) collection.add(e);

对于阻塞队列,每次迭代(很可能)都会获得一些锁并再次释放它,这不是最优的。例如,如果您查看ArrayBlockingQueue 中的实现,您会看到在整个迭代过程中只获取一次锁,这可能是因为该库的作者发现它更有效。

【讨论】:

【解决方案2】:

这里的重点是所有锁定和信号都发生在伪代码 while 块之外,所以是的,这只是为了提高效率。对于非并发队列,反正没有这样的保护,所以while块就足够了。

【讨论】:

    猜你喜欢
    • 2010-11-15
    • 2013-07-25
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多