【发布时间】:2013-07-16 13:21:22
【问题描述】:
想知道为什么method drainTo 只出现在并发收集框架中(特别是BlockingQueue)而不是常规收集框架中。有什么理由吗?
提前致谢。
【问题讨论】:
-
您可能还会发现this related discussion 很有趣,尽管它不能回答您的问题。
标签: java concurrency queue blockingqueue
想知道为什么method drainTo 只出现在并发收集框架中(特别是BlockingQueue)而不是常规收集框架中。有什么理由吗?
提前致谢。
【问题讨论】:
标签: java concurrency queue blockingqueue
像往常一样,如果不问课程的作者本人,就很难说出来。但我们可以做出一些有根据的猜测。
javadoc 声明:
从此队列中删除所有可用元素并将它们添加到给定集合中。此操作可能比重复轮询此队列更有效。
所以根本原因可能是为了效率。
drainTo 本质上等同于(在单线程环境中,为简单起见):
while ((e = queue.poll()) != null) collection.add(e);
对于阻塞队列,每次迭代(很可能)都会获得一些锁并再次释放它,这不是最优的。例如,如果您查看ArrayBlockingQueue 中的实现,您会看到在整个迭代过程中只获取一次锁,这可能是因为该库的作者发现它更有效。
【讨论】:
这里的重点是所有锁定和信号都发生在伪代码 while 块之外,所以是的,这只是为了提高效率。对于非并发队列,反正没有这样的保护,所以while块就足够了。
【讨论】: