2013-07-16 64 views
0

想知道爲什麼methoddrainTo僅存在於併發收集框架(特別是BlockingQueue)中,而不是常規收集框架中。這有什麼理由嗎? 在此先感謝。併發包中的阻塞隊列方法;

+0

你也許會發現[這個相關的討論](http://cs.oswego.edu/pipermail/concurrency-interest/2006-April/002448.html)有趣,雖然它不能回答你的問題。 – assylias

回答

1

一如既往的這樣的問題,很難說沒有問自己的作者。但我們可以做出一些有教育意義的猜測。

的Javadoc指出:

移除此隊列中所有可用的元素,並將它們添加到給定collection。該操作可能比重複輪詢該隊列更有效。

所以潛在的原因可能是效率。

drainTo基本上等同(在單線程環境中,爲簡單起見),用於:

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

隨着阻塞隊列,每次迭代是(很可能)要獲得一些鎖並再次釋放,這不是最優的。例如,如果您看到ArrayBlockingQueue的實現,您會看到鎖在整個迭代中被獲取一次,可能是因爲庫的作者發現它更高效。

+0

assylias這裏還有另一個問題可能會讓你感興趣:http://stackoverflow.com/questions/17674931/arraydeque-and-linkedblockingdeque – Rollerball

+0

@滾球不知道說實話... – assylias

0

重點是在這裏所有的鎖定和信號發生在僞代碼塊外,所以是的,它只是爲了提高效率。對於非併發隊列,無論如何都沒有這種保護,所以while-block就足夠了。