作者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://webptt.com/cn.aspx?n=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
1F:→ ssccg: 就不能确保啊,你把add後面加个thread sleep慢慢加就知道 06/24 15:17
2F:→ ssccg: 单纯是加10个的动作太快,比consumer开始执行还快 06/24 15:19
3F:→ uopsdod: 所以我能说 其实还是用.addAll(..)才算真的安全? 06/27 23:12
4F:→ zop: 开个thread用布林判断,全都加入之後再允许存取? 06/28 19:20
5F:→ cowbaying: sync就好了吧... 06/29 01:10
6F:推 seedli: blockingQueue是threadsafe,没问题的 07/05 17:44
8F:→ ssccg: 应该说实作上通常不会需要去防止放一个拿一个的问题,通常 07/05 17:59
9F:→ ssccg: 本来就会希望consumer有空就马上处理,原po的范例程式只是 07/05 18:00
10F:→ ssccg: 要demo效果写那样的执行结果比较好看,不然真的要按照顺序 07/05 18:04
11F:→ ssccg: 的话,该用的不是Priority,而是Task之间本来就要有顺序 07/05 18:05
12F:→ ssccg: 另外addAll是thread safe,但没有保证atomic 07/05 18:10