看板 java 關於我們 聯絡資訊
小弟現在實作 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