想知道为什么method drainTo
仅存在于并发集合框架(特别是BlockingQueue)而不是常规集合框架中。有什么理由吗?
提前谢谢。
答案 0 :(得分:1)
一如既往地提出这样的问题,如果不亲自询问班级的作者,就很难说。但我们可以做一些有根据的猜测。
javadoc声明:
从此队列中删除所有可用元素,并将它们添加到给定集合中。此操作可能比重复轮询此队列更有效。
因此潜在的原因可能是提高效率。
drainTo
基本上等同于(在单线程环境中,为简单起见):
while ((e = queue.poll()) != null) collection.add(e);
使用阻塞队列,每次迭代(很可能)将获得一些锁并再次释放它,这不是最佳的。例如,如果你看一下ArrayBlockingQueue
中的实现,你会发现整个迭代都会获得一次锁,可能是因为库的作者发现它更有效。
答案 1 :(得分:0)
关键在于所有锁定和信号发生在伪编码的块之外,所以是的,它仅用于效率。对于非并发队列,无论如何都没有这样的保护,所以while-block就足够了。