想知道爲什麼methoddrainTo
僅存在於併發收集框架(特別是BlockingQueue)中,而不是常規收集框架中。這有什麼理由嗎? 在此先感謝。併發包中的阻塞隊列方法;
回答
一如既往的這樣的問題,很難說沒有問自己的作者。但我們可以做出一些有教育意義的猜測。
的Javadoc指出:
移除此隊列中所有可用的元素,並將它們添加到給定collection。該操作可能比重複輪詢該隊列更有效。
所以潛在的原因可能是效率。
drainTo
基本上等同(在單線程環境中,爲簡單起見),用於:
while ((e = queue.poll()) != null) collection.add(e);
隨着阻塞隊列,每次迭代是(很可能)要獲得一些鎖並再次釋放,這不是最優的。例如,如果您看到ArrayBlockingQueue
的實現,您會看到鎖在整個迭代中被獲取一次,可能是因爲庫的作者發現它更高效。
assylias這裏還有另一個問題可能會讓你感興趣:http://stackoverflow.com/questions/17674931/arraydeque-and-linkedblockingdeque – Rollerball
@滾球不知道說實話... – assylias
重點是在這裏所有的鎖定和信號發生在僞代碼塊外,所以是的,它只是爲了提高效率。對於非併發隊列,無論如何都沒有這種保護,所以while-block就足夠了。
- 1. Java中的併發和阻塞隊列
- 2. 併發問題 - 阻塞隊列
- 3. Java中的阻塞隊列
- 4. 非阻塞隊列
- 5. 阻塞隊列Ç
- 6. 阻塞隊列不阻塞線程?
- 7. LinkedTransferQueue是阻塞隊列還是非阻塞隊列?
- 8. Java,被阻塞的隊列
- 9. 非阻塞Jms隊列發件人
- 10. 當隊列類型包含通用類型時阻塞隊列
- 11. 阻塞隊列實現
- 12. 測試非阻塞隊列
- 13. 隊列阻塞主線程
- 14. 阻塞隊列和InterruptedException
- 15. 阻塞隊列設計
- 16. REST和阻塞隊列
- 17. 單進程阻塞隊列
- 18. GCD - dispatch_async上阻塞隊列
- 19. Java - 併發/阻塞隊列單元測試策略
- 20. 是否在同步GCD隊列上放置一個阻止阻塞並暫停其他阻塞的阻塞?
- 21. 有沒有辦法在java中阻塞套接字和阻塞隊列?
- 22. 阻塞隊列的「聯合」的實現
- 23. ThreadPoolExecutor共享相同的阻塞隊列
- 24. 阻塞兩個隊列上的呼叫?
- 25. Win32 API的信號燈 - 阻塞隊列
- 26. 等待併發GC阻塞
- 27. 僅包含唯一元素的Java阻塞隊列
- 28. gae中的lease_tasks()是否阻塞了一個阻塞方法?
- 29. 通知(),而不是notifyAll()阻塞隊列
- 30. 阻塞隊列使用場景
你也許會發現[這個相關的討論](http://cs.oswego.edu/pipermail/concurrency-interest/2006-April/002448.html)有趣,雖然它不能回答你的問題。 – assylias