看板 java 關於我們 聯絡資訊
想請問各位大大像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