作者uopsdod (pcman)
看板java
標題[問題] BlockingQueue
時間Sat Jun 24 15:04:20 2017
最近正在看Thinking in Java 4/e, 讀一讀有些問提陸續想請教大家
------------------------------------------------------------
Code here:
https://pastebin.com/CKMPzJj1
我不是很明白下列這個code中,下面這段
for (int i = 0; i < 10; i++) {
queue.add(new PrioritizedTask(i));
// 怎麼能確保一定加入這麼快,並且都排序好了?
// 中途Consumer不會插隊進來拿嗎??????
}
為何每次測試,都能確保 queue都先add完全部並排序好之後,consumer才來拿?
我以為會每次producer放進一個,consumer就會馬上拿走,
想請問我有哪部分是理解錯了,感謝!
本來以為要用queue.addAll(..)這個方法才比較保險,想問問大家想法。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.217.172.51
※ 文章網址: https://www.ptt.cc/bbs/java/M.1498287863.A.EB3.html
※ 編輯: uopsdod (180.217.172.51), 06/24/2017 15:05:05
※ 編輯: uopsdod (180.217.172.51), 06/24/2017 15:05:28
※ 編輯: uopsdod (180.217.172.51), 06/24/2017 15:07:20
→ ssccg: 就不能確保啊,你把add後面加個thread sleep慢慢加就知道 06/24 15:17
→ ssccg: 單純是加10個的動作太快,比consumer開始執行還快 06/24 15:19
→ uopsdod: 所以我能說 其實還是用.addAll(..)才算真的安全? 06/27 23:12
→ zop: 開個thread用布林判斷,全都加入之後再允許存取? 06/28 19:20
→ cowbaying: sync就好了吧... 06/29 01:10
推 seedli: blockingQueue是threadsafe,沒問題的 07/05 17:44
→ ssccg: 應該說實作上通常不會需要去防止放一個拿一個的問題,通常 07/05 17:59
→ ssccg: 本來就會希望consumer有空就馬上處理,原po的範例程式只是 07/05 18:00
→ ssccg: 要demo效果寫那樣的執行結果比較好看,不然真的要按照順序 07/05 18:04
→ ssccg: 的話,該用的不是Priority,而是Task之間本來就要有順序 07/05 18:05
→ ssccg: 另外addAll是thread safe,但沒有保證atomic 07/05 18:10