【问题标题】:I just can't kill Java thread我就是无法杀死 Java 线程
【发布时间】:2011-02-07 21:38:04
【问题描述】:

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

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%。

杀死一个线程是不可能的?

【问题讨论】:

  • 你必须在打开调试器时在脖子上戴一点大蒜,四处洒上圣水,然后用木牛排敲打进程的心脏,最后砍下它的头并烧掉它遗迹。这是唯一确定的方法。 (当然,或者从轨道上对其进行核打击。)
  • @Jeffrey L Whitledge:是的,这样做然后你发现自己有 20 多个线程冻结在死锁中,因为你刚刚杀死的线程在持有没有人可以释放的锁的钥匙时被焚毁因为对象处于不一致的状态。

标签: java multithreading kill


【解决方案1】:

杀死一个线程是不可能的?

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

【讨论】:

    【解决方案2】:

    尝试设置uc.setReadTimeout(30000);

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 好建议;它会从卡住的任何地方发射java.io.InterruptedIOException,并且getInputStream 被记录为能够抛出那种东西。 (嗯,它的超类。)
      【解决方案4】:

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

      你可以做的是让线程自动关闭。编写下载线程,使其在超时时自行终止。

      【讨论】:

      • 我想这样做,但线程在 API 函数处挂起。线程冻结后,我无法控制线程内部(我不能说“do{}while(alive==true)”并随时设置alive=false,因为由于API方法冻结,while行永远不会执行) .
      猜你喜欢
      • 2016-02-29
      • 2010-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      相关资源
      最近更新 更多