Adr*_*ian 4 java multithreading kill
我有一个线程,使用不同的代理从Internet下载一些图像.有时会挂起,不能以任何方式杀死.
public HttpURLConnection uc;
public InputStream in;
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("server", 8080));
URL url = new URL("http://images.com/image.jpg");
uc = (HttpURLConnection)url.openConnection(proxy);
uc.setConnectTimeout(30000);
uc.setAllowUserInteraction(false);
uc.setDoOutput(true);
uc.addRequestProperty("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
uc.connect();
in = uc.getInputStream();
Run Code Online (Sandbox Code Playgroud)
当它挂起时,它会冻结在该uc.getInputStream()方法上.我做了一个计时器,如果它的运行时间超过3分钟就试图杀死它.我试过.terminate()这个帖子.没有效果.我尝试uc.disconnect()从主线程.该方法也挂起并与它一起,主线程.我试过了in.close().没有效果.我试过uc=null,in=null希望有一个异常将结束线程.它一直在运行.它从未通过该uc.getInputStream()方法.
在我的上一次测试中,线程在收到所有上述命令(或各种组合)后持续超过14小时.我不得不杀死Java进程来阻止线程.
如果我只是忽略该线程,并将其实例设置为null,则该线程不会死亡并且不会被垃圾收集器清除.我知道,因为如果我让应用程序运行了几天,那么Java进程会占用越来越多的系统内存.在3天内,我的8Gb系统RAM占了10%.
什么都不可能杀死一个线程?
什么都不可能杀死一个线程?
在许多情况下,是的 - 尤其是当线程在不可中断的IO上被阻止时.您可以通过uc.getInputStream().close()从另一个线程调用来解除阻塞.虽然这可能不是线程安全的.HttpUrlConnection也有一个你应该在你的情况下设置的setReadTimeout().
| 归档时间: |
|
| 查看次数: |
1973 次 |
| 最近记录: |