作者jinn (阿昌)
看板java
標題[問題] 〈誠心發問〉請問「多個下載」是怎麼寫的?
時間Mon Aug 10 09:12:35 2009
想請問各位大大像FlashGet、FireFox的下載那樣「有一大堆連結準備下載,卻維持同時
只下載三個東西」要怎麼寫啊?新增執行緒嗎?
這是我原本的想法:↓
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void method(String[] 網址 ){
...
for(int i=0; i <= 網址[].length ; i++){
String DD = 網址[i];
while(true){
if(Thread.activeCount() <= 3 ){
//執行緒是否小於三個
Thread t = new Thread(new 下載(DD) );
//新增執行緒
t.start();
break;
}
}
}
}
class 下載 implements Runnable {
下載(String D){...} //建構子
public void run(){...} //方法run()
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
只是這樣寫的話,while迴圈一直執行判斷"執行緒有幾個"好像會很耗資源。
還是其實那些下載軟體是幾個網址連結就新增幾個執行緒,讓系統依負荷自己挑選要執行
哪幾個的?
可不可以請各位大大們解說一下概念~ 謝謝m(_ _)m
ps.JavaWorld是不是倒了@@?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.165.194.94
→ kuninaka:寫個物件 繼承Thread吧 裡面用一個Class Var.記錄下載量 08/10 09:38
推 kuninaka:阿 跟你的想法一樣XD 08/10 09:39
→ kuninaka:用listen的方式吧 當下載完成的時候呼叫callback 08/10 09:41
推 qrtt1:flashget 有印出他使用的 http 指令 :D 08/10 09:46
推 pao0111:有個簡單的方法,使用生產者與消費者樣式可限制執行緒數量 08/10 11:11
→ pao0111:生產者與消費者間隔一個BlockingQueue,用來queue下載任務 08/10 11:14
→ pao0111:生產者塞下載任務到queue,n個消費者從queue取任務來處理 08/10 11:18
→ pao0111:還沒處理的下載都在queue裡,n為多少就是同時下載幾個囉~ 08/10 11:21
→ jinn:謝謝各位大大精闢的分析,我會努力思考學習的xd 08/10 19:30
→ jinn:順便問一下,BlockingQueue有許多子類別,用哪種比較好啊@@? 08/10 19:33
推 pao0111:就這case而言,LinkedBlockingQueue是個很直覺的選擇 ^^ 08/11 23:14
推 adrianshum:直接利用 ThreadPoolExecutor 更簡單易明瞭 08/12 10:41
→ jinn:嗯嗯~謝謝大家的幫忙,讓我發現許多明路,甘溫XD 08/13 10:52