java - 我就是无法杀死 Java 线程

标签 java multithreading kill

我有一个线程使用不同的代理从互联网上下载一些图像。 有时它会挂起,并且无法通过任何方式杀死。

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 系统内存的 10%。

无论如何都不可能杀死一个线程?

最佳答案

It is impossible to kill a thread whatever?

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

关于java - 我就是无法杀死 Java 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2637309/

相关文章:

c++ - 餐饮哲学家的问题-只有2个线程起作用

android - 在异步任务中启动新线程

linux - bash 脚本超时后终止命令

android - 防止 Activity 堆栈被恢复?

java - 如何将 <%= ...> 设置为循环计数器?

java - 通过动态参数反射调用方法

java - 为什么我的 xml 的 JAXB namespace 设置为默认 ns1?

java - 在单独线程或同一线程中创建 ActiveMQ 监听器的区别

java - 从 jar 文件中的文件夹中读取文件

C# 杀死一个线程