作者lin1987www (林奕忠)
看板java
标题[问题] Thread 都在 Wait,你会怎麽做?
时间Wed May 21 19:27:39 2014
以下挑战白话文解说
我固定请了5个员工,然後分配5个员工去从生产,而工厂的生产前,
必须有人去打开电源,才能使机械运作,才能开始生产。
若有1个员工要从事生产时,若发现电源没开的话,
就会请下一个员工,也就是第2名员工,去打开电源开关。
当我工厂要一口气生产4个产品的时候,就会一口气有4个人冲向机台,
等待开工,这时第5个人就会去打开电源开关。
很不幸的事,我一口气要生产5个产品的时候,就有5个人冲向机台,
但是没有人去打开电源,因为我一开始就说了,我只请5个员工 Orz
然後整个工厂就停工了 ...
◢▆▅▄▃崩╰(〒皿〒)╯溃▃▄▅▇◣
Thread 有办法限制说不会进行 wait吗?
或者变成 non-blocking 的形式有可能吗?
或者该怎麽避免此问题的发生呢?
从描述可以看的出来勤俭持家的我是用
Executors.newFixedThreadPool
而不是用有钱人专用的 ( 大误 )
Executors.newCachedThreadPool
小弟我想请教 大大们都怎样解决这问题? Q"Q
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.134.106.87
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/java/M.1400671661.A.318.html
1F:推 backforward:sync 05/21 19:39
3F:→ kingofsdtw:关键字setDelayTime 05/21 20:07
4F:→ lin1987www:xd 简单的方式特地专用的Thread来处理,或者狂开Thread 05/21 21:26
5F:→ lin1987www:谢谢1F2F的建议 xd 太抽象了 05/21 21:30
6F:→ luoqr:发现没开开关就去开啊~管他是谁? 05/21 21:38
7F:→ bitlife:这从程式逻辑下手就好吧? 每个员工在冲向机台前,先检查电 05/21 21:38
8F:→ bitlife:源开否,若未开则进入critical section 开电源应该就OK了 05/21 21:39
9F:→ bitlife:如果电只能开一次,那就进临界区间後再检查一次是否己开 05/21 21:41
10F:推 pupuliao:为什麽不能做成 当员工进入产线後 产线自动期动呢? 05/22 02:49
11F:→ qrtt1:为什麽 setDelayTime 能解决问题!? 05/22 08:03
12F:推 kingofsdtw:5张订单去塞爆一条A级产线,A级产线必须5倍速度@_@ 05/22 08:25
13F:推 popcorny:我只是想说 "为什麽发现没开要请下个员工开?" 05/22 09:11
14F:→ PsMonkey:我始终觉得 kingofsdtw 的各种思维都很微妙(又在酸人了 05/22 10:17
15F:推 PsMonkey:btw.. 我觉得原 po 的白话文解说很棒 \囧/ 05/22 10:17
16F:→ andymai:"为何没开要请下个人开?"+1 限制5个又动5个~真的不奇怪吗? 05/22 13:04
上工的人在等待电源被打开,而打开电源这件事情
在我设计上,上工的人单纯等电源被打开就好 ( 职责区分 考虑到 松散耦合 )
由於工厂上次偷排「废水」,被抓到後勒令停工 ( 掰的跟真的一样 XD)
所以工人需要拿到「复工计画书」才敢打开电源
而如今5个工人都在生产线上等上工,没有工人能在
「复工计画书」生出来後,拿着计划书去开电源 ( 计画书是个参数 )
※ 编辑: lin1987www (220.134.106.87), 05/22/2014 17:12:00
※ 编辑: lin1987www (220.134.106.87), 05/22/2014 17:19:52
17F:→ bestlong:若强调职责区分就应该要一个工人专门开电 05/22 17:32
楼上说的没错,现在我就改成有用 Executors.newCachedThreadPool 来负责重要的任务
18F:推 lovdkkkk:看起来可以用 listener 的方式 (随便谁开完电跟别人说) 05/22 17:33
用 Listener倒是没想过...程式码可能会有点丑,不然就是Memory leak...
在我的设计中,没使用Listener,而改是EventBus的,但这是我程式设计上的问题 Orz
用 Listener 无法试用我现在的情况,感谢楼上大大提供意见 :)
19F:推 bestlong:五个工人都上工後,也没工人去拿复工计画书吧 05/22 17:37
没错 Q_Q 没有工人去执行这项任务
※ 编辑: lin1987www (220.134.106.87), 05/22/2014 17:44:04
※ 编辑: lin1987www (220.134.106.87), 05/22/2014 17:45:38
※ 编辑: lin1987www (220.134.106.87), 05/22/2014 17:56:30
20F:→ bestlong:既然工人都先上工,那就由老板负责开电吧 05/22 18:05