作者killeryagami (kira)
看板java
標題[問題] Thread 強迫中斷
時間Wed May 27 11:17:20 2009
小弟現在實作 Thread 去讀取網頁資料
但是在中斷Thread發生一些問題,Code大致如下
public class paserHtml{
public ArrayList<String> paser(){
//蒐集與關鍵字有關的Url
ArrayList<String> collectUrl = WebPage("關鍵字");
ArrayList<String> result = new ArrayList<String>();
for(int i=0;i<collectUrl.size();i++){
MyThread td = new MyThread();
td.setUrl(collectUrl.get(i),result);
//設定要搜尋的Url,將結果存入result
td.start(); //開始撈資料
}
/*
以下設定是為了讓主程式等待Thread執行完畢,
如果超過五秒則主程式結束,忽略五秒後才搜尋到的資料。
*/
long startTime = System.currentTimeMillis();
for(;;){
long timeout = System.currentTimeMillis();
if(timeout>5000)
break;
}
return result;
}
}
此程式執行後由於Url數目眾多,因此產生的Thread也很多
而有另一支程式將搜集許多關鍵字,然後利用本程式撈資料
我想可能是在這部份產生OutOfMemoryException,因此在五秒後
需要強制結束Thread動作,歸還記憶體。
但是Thread的Stop()與destory()都已經deprecated
目前試過的方法是先讓執行緒wait()之後interrupt()丟出Exceptions 然後結束
不過沒有用,跑了一段時間之後還是OutOfMemory
而且很奇怪的是,result應該每次重新new的時候都會配置新位址
所以不同關鍵字的結果應該不會互相干擾,但事實上會
總結問題
1、Thread「似乎」殺不死,一直停留在記憶體中
2、result 結果互相干擾,關鍵字一會影響到關鍵字二
2的問題我還在找,主要是1的問題,我希望五秒後所有Thread停止並釋放空間
不曉得有哪位神手可以解決這個困難,小弟我困擾了兩個星期......
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.109.18.228
推 TonyQ:用Thread.sleep(5000) 比你的無窮迴圈省力啦...--;; 05/27 11:37
推 adrianshum:ArrayList<String> collectUrl=new WebPage("關鍵字")? 05/27 11:41
推 TonyQ:我覺得問題應該在於 td 裡面如何實作... 05/27 11:47
推 adrianshum:還有, 幾個thread共用同一個result, 結果當然混在一起 05/27 11:51
※ 編輯: killeryagami 來自: 140.109.18.228 (05/27 12:24)
→ killeryagami:2F:誤植多個new,改回來了 05/27 12:26
→ killeryagami:共用的原因是,部分執行緒負責同一個關鍵字網頁 05/27 12:33
推 adrianshum:thread 盡量以 logic 來停止. 但真的要app停止時不理 05/27 14:23
→ killeryagami:感謝回答 05/27 17:36
推 adrianshum:(忘了繼續答)不理thread完成與否, 請把thread設daemon 05/27 18:06