我有一个线程使用不同的代理从互联网上下载一些图像。 有时它会挂起,并且无法通过任何方式杀死。
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=null
、in=null
希望出现异常来结束线程。它一直在运行。
它从不传递 uc.getInputStream()
方法。
在我的上次测试中,线程在收到所有上述命令(或各种组合)后持续了 14 多个小时。我必须终止 Java 进程才能停止线程。
如果我只是忽略线程,并将它的实例设置为 null,则线程不会死亡,也不会被垃圾收集器清除。我知道,因为如果我让应用程序运行几天,Java 进程会占用越来越多的系统内存。在 3 天内,它占用了我 8Gb 系统内存的 10%。
无论如何都不可能杀死一个线程?
最佳答案
It is impossible to kill a thread whatever?
在许多情况下,是的 - 特别是当线程在不可中断的 IO 上被阻塞时。
您可以通过从另一个线程调用 uc.getInputStream().close()
来解除阻塞。虽然这可能不是线程安全的。 HttpUrlConnection 也有一个 setReadTimeout () 你可能应该在你的情况下设置。
关于java - 我就是无法杀死 Java 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2637309/