[問題] BlockingQueue

看板java作者 (pcman)時間7年前 (2017/06/24 15:04), 7年前編輯推噓1(1011)
留言12則, 5人參與, 最新討論串1/1
最近正在看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

06/24 15:17, , 1F
就不能確保啊,你把add後面加個thread sleep慢慢加就知道
06/24 15:17, 1F

06/24 15:19, , 2F
單純是加10個的動作太快,比consumer開始執行還快
06/24 15:19, 2F

06/27 23:12, , 3F
所以我能說 其實還是用.addAll(..)才算真的安全?
06/27 23:12, 3F

06/28 19:20, , 4F
開個thread用布林判斷,全都加入之後再允許存取?
06/28 19:20, 4F

06/29 01:10, , 5F
sync就好了吧...
06/29 01:10, 5F

07/05 17:44, , 6F
blockingQueue是threadsafe,沒問題的
07/05 17:44, 6F

07/05 17:48, , 7F
put()的API https://goo.gl/3YvvLQ 塞滿之後才會wait()
07/05 17:48, 7F

07/05 17:59, , 8F
應該說實作上通常不會需要去防止放一個拿一個的問題,通常
07/05 17:59, 8F

07/05 18:00, , 9F
本來就會希望consumer有空就馬上處理,原po的範例程式只是
07/05 18:00, 9F

07/05 18:04, , 10F
要demo效果寫那樣的執行結果比較好看,不然真的要按照順序
07/05 18:04, 10F

07/05 18:05, , 11F
的話,該用的不是Priority,而是Task之間本來就要有順序
07/05 18:05, 11F

07/05 18:10, , 12F
另外addAll是thread safe,但沒有保證atomic
07/05 18:10, 12F
文章代碼(AID): #1PJWxtwp (java)
文章代碼(AID): #1PJWxtwp (java)