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

看板java作者 (畢業了..@@")時間11年前 (2014/05/22 18:03), 11年前編輯推噓2(203)
留言5則, 2人參與, 最新討論串4/4 (看更多)
※ 引述《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://www.ptt.cc/bbs/java/M.1400753026.A.81E.html ※ 編輯: popcorny (118.163.46.230), 05/22/2014 18:04:22

05/22 19:08, , 1F
之後我還是使用wait & notifyAll,為了連慣性
05/22 19:08, 1F

05/22 19:11, , 2F
使用Thread Pool反而是為了限制Task同時執行的數量
05/22 19:11, 2F

05/22 19:13, , 3F
因為多數的Task中,都有使用網路連線,我不希望開太多
05/22 19:13, 3F

05/22 19:15, , 4F
如果開啟太多網路連線,我覺得對效能可能有衝擊 xd
05/22 19:15, 4F

05/23 21:28, , 5F
05/23 21:28, 5F
文章代碼(AID): #1JVSk2WU (java)
文章代碼(AID): #1JVSk2WU (java)