看板 java 關於我們 聯絡資訊
最近正在看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
seedli: put()的API https://goo.gl/3YvvLQ 塞滿之後才會wait() 07/05 17:48
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