【问题标题】:Thread join(milliseconds) not killing thread in Java线程连接(毫秒)不会杀死 Java 中的线程
【发布时间】:2018-07-14 21:26:15
【问题描述】:

我正在尝试使用 Thread.join(millis) 使正在运行的线程超时,但它只是挂起并且没有超时。这可能是什么原因?示例代码

public static void main(String[] args) throws InterruptedException {
    final Thread t1 = new Thread(() -> {
        for (int i = 0; i < 100000000000000000L; i++) {
        }
    });
    t1.start();
    t1.join(100);
    System.out.println("t1.join called");
}

【问题讨论】:

  • 为我工作:ideone.com/qTUHCz
  • t1.join called 被显示,但是JVM不会退出,因为Thread 不是守护进程,所以它会一直等到它完成。 join(int) 是“当前”线程等待相关线程结束的时间,如果达到超时值,该方法将简单地返回,它对正在运行的线程没有影响
  • @shmosel 啊,实际上那个页面说 Time limit exceeded #stdin #stdout 5s 4837376KB,这意味着我认为运行该代码 sn-p 的引擎不会让代码运行超过 5s,如果您尝试在 IDE 中运行它,它可能会有不同的行为
  • 也适合我
  • @MadProgrammer,啊,非常感谢,这让我发疯了,因为文档说“最多等待几毫秒让这个线程死掉。”我认为这暗示如果等待超过限制,它将杀死线程。这是有道理的,它只是等待它完成,如果超过这个限制,连接将返回并且调用者线程可以继续做它想做的任何事情

标签: java multithreading timeout java-threads


【解决方案1】:

线程连接(毫秒)不会杀死 Java 中的线程

这并不是要杀死线程。它意味着等待它退出到超时值,然后如果超时过期,则将InterruptedException 抛出到 current 线程。请参阅 Javadoc。

【讨论】:

  • 是的,@MadProgrammer 已经回答了这个问题,但接受了,因为他/她说的是正确的
  • 而且您还添加了 InterruptedException 位,我发现了但尚未提及这可能对其他人有帮助
  • JDK 7、8 和 11 的方法 Javadoc 中没有任何地方说 join(long) 在超时到期时抛出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-29
  • 2013-01-10
  • 2010-11-09
相关资源
最近更新 更多