作者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
1F:推 TonyQ:用Thread.sleep(5000) 比你的无穷回圈省力啦...--;; 05/27 11:37
2F:推 adrianshum:ArrayList<String> collectUrl=new WebPage("关键字")? 05/27 11:41
3F:推 TonyQ:我觉得问题应该在於 td 里面如何实作... 05/27 11:47
4F:推 adrianshum:还有, 几个thread共用同一个result, 结果当然混在一起 05/27 11:51
※ 编辑: killeryagami 来自: 140.109.18.228 (05/27 12:24)
5F:→ killeryagami:2F:误植多个new,改回来了 05/27 12:26
6F:→ killeryagami:共用的原因是,部分执行绪负责同一个关键字网页 05/27 12:33
7F:推 adrianshum:thread 尽量以 logic 来停止. 但真的要app停止时不理 05/27 14:23
8F:→ killeryagami:感谢回答 05/27 17:36
9F:推 adrianshum:(忘了继续答)不理thread完成与否, 请把thread设daemon 05/27 18:06