Re: [問題] Thread 都在 Wait,你會怎麼做?

作者: popcorny (畢業了..@@")   2014-05-22 18:03:44
※ 引述《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就不應該卡住
試想有沒有看過銀行行員服務一個客人的時候,
客人忽然電話來了講電話
或是慢慢的填早該先填好的表單
結果等著大半天,你在後面等的很幹的情況
這就是不好的設計
你可以請他再去領一個新的號碼牌
填好再回來
而不是卡在那邊才對
作者: lin1987www (林奕忠)   2014-05-22 19:08:00
之後我還是使用wait & notifyAll,為了連慣性
作者: lin1987www (林奕忠)   2014-05-22 19:11:00
使用Thread Pool反而是為了限制Task同時執行的數量
作者: lin1987www (林奕忠)   2014-05-22 19:13:00
因為多數的Task中,都有使用網路連線,我不希望開太多
作者: lin1987www (林奕忠)   2014-05-22 19:15:00
如果開啟太多網路連線,我覺得對效能可能有衝擊 xd
作者: dream1124 (全新開始)   2014-05-23 21:28:00

Links booklink

Contact Us: admin [ a t ] ucptt.com