并发包中的阻塞队列方法;

时间:2013-07-16 13:21:23

标签: java concurrency queue blockingqueue

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

2 个答案:

答案 0 :(得分:1)

一如既往地提出这样的问题,如果不亲自询问班级的作者,就很难说。但我们可以做一些有根据的猜测。

javadoc声明:

  

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

因此潜在的原因可能是提高效率。

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

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

使用阻塞队列,每次迭代(很可能)将获得一些锁并再次释放它,这不是最佳的。例如,如果你看一下ArrayBlockingQueue中的实现,你会发现整个迭代都会获得一次锁,可能是因为库的作者发现它更有效。

答案 1 :(得分:0)

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