繁体   English   中英

我只是无法杀死Java线程

[英]I just can't kill Java thread

我有一个线程,使用不同的代理从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();

当它挂起时,它会在uc.getInputStream()方法中冻结。 我制作了一个计时器,如果它的运行时间超过3分钟,它会试图杀死该线程。 我试过.terminate()线程。 没有效果。 我从主线程尝试了uc.disconnect() 该方法也挂起并与它一起,主线程。 我试过in.close() 没有效果。 我试过uc=nullin=null希望有一个异常将结束线程。 它一直在运行。 它永远不会传递uc.getInputStream()方法。

在我的上一次测试中,线程在收到所有上述命令(或各种组合)后持续超过14小时。 我不得不杀死Java进程来阻止线程。

如果我只是忽略该线程,并将其实例设置为null,则该线程不会死亡并且不会被垃圾收集器清除。 我知道,因为如果我让应用程序运行了几天,那么Java进程会占用越来越多的系统内存。 在3天内,我的8Gb系统RAM占了10%。

什么都不可能杀死一个线程?

什么都不可能杀死一个线程?

在许多情况下,是的 - 尤其是当线程在不可中断的IO上被阻止时。 您可以通过从另一个线程调用uc.getInputStream().close()来取消阻止它。 虽然这可能不是线程安全的。 HttpUrlConnection也有一个你应该在你的情况下设置的setReadTimeout ()。

尝试设置uc.setReadTimeout(30000);

除了设置读取超时(在其他回复中提到),您是否尝试中断线程?

不,你不能。 从外部杀死一个线程本质上是不安全的操作。

你能做的就是让线程自愿关闭。 编写下载线程,以便在超过超时时自行终止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM