0

想知道为什么该方法 drainTo仅存在于并发收集框架(特别是BlockingQueue)中,而不存在于常规收集框架中。有什么理由吗?提前致谢。

4

2 回答 2

1

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

javadoc 指出:

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

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

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

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

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

于 2013-07-16T13:31:58.563 回答
0

关键是所有锁定和信号都发生在伪代码 while 块之外,所以是的,它只是为了提高效率。对于非并发队列,无论如何都没有这样的保护,所以 while-block 就足够了。

于 2013-07-16T15:12:19.657 回答