作者popcorny (毕业了..@@")
看板java
标题Re: [问题] Thread 都在 Wait,你会怎麽做?
时间Thu May 22 18:03:44 2014
※ 引述《lin1987www (林奕忠)》之铭言:
: 将自己重新加入排程相当不错,至少我没想过能这样用 XD
: 但是我有用到Future的,根据你的思考模式,当要开工前,就预判能不能开工
: 如果没打开电源的话,就不要在机台前面等 XD 这样就不是占用 Thread
: 范例网址:
: http://ideone.com/7wG3J7
: 可惜的是我用到的Future特性,将一连串动作串起来
: 如果重新加入Executor的话,我没办法把
: 先前加入的Future串起来 Orz
: 再者我思考了我的设计,有重大的缺失,
: 像打开电源这麽重要的任务,应该要有新的Thread或者专用的Thread,
: 这样做应该会比较妥当。
: 感谢大大让我脑力激荡
另外我想要说的是你举的例子可能观念跟ThreadPool有点不一样..
我会认为工人是Thread
ThreadPool的num=5就是五个工人
并且这五个人会把一个taskqueue中的task拿出来做
所以每个工人的流程是
1. 拉一个工作来做
2. 做完了
3. 拉下一个工作来做
4. 做完了
5. 再拉..
6. ...
这也像我们去银行拿号码牌..
行员是Thread
号码牌是Task
银行整个柜台就是ThreadPool
号码机就是TaskQueue
而你的例子比较像是一个工人只会负责一个工作
像是传统的一个Thread一个long running task
这时候我们会用wait/notify的方式去sync跟控制步调
工人会wait engine这个object engine.wait()
开电的会notify engine这个object engine.notify()
所以这两个做法不太一样..
所以你要思考一下你要选择哪一种..
当你选择thread pool.
每个task就不应该卡住
试想有没有看过银行行员服务一个客人的时候,
客人忽然电话来了讲电话
或是慢慢的填早该先填好的表单
结果等着大半天,你在後面等的很干的情况
这就是不好的设计
你可以请他再去领一个新的号码牌
填好再回来
而不是卡在那边才对
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.163.46.230
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/java/M.1400753026.A.81E.html
※ 编辑: popcorny (118.163.46.230), 05/22/2014 18:04:22
1F:推 lin1987www:之後我还是使用wait & notifyAll,为了连惯性 05/22 19:08
2F:→ lin1987www:使用Thread Pool反而是为了限制Task同时执行的数量 05/22 19:11
3F:→ lin1987www:因为多数的Task中,都有使用网路连线,我不希望开太多 05/22 19:13
4F:→ lin1987www:如果开启太多网路连线,我觉得对效能可能有冲击 xd 05/22 19:15
5F:推 dream1124:推 05/23 21:28