※ 引述《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就不应该卡住
试想有没有看过银行行员服务一个客人的时候,
客人忽然电话来了讲电话
或是慢慢的填早该先填好的表单
结果等著大半天,你在后面等的很干的情况
这就是不好的设计
你可以请他再去领一个新的号码牌
填好再回来
而不是卡在那边才对