【问题标题】:What if I join the terminated(dead) thread如果我加入终止(死)线程怎么办
【发布时间】:2019-12-23 23:03:55
【问题描述】:

在这里,我正在尝试在线程终止后加入线程,代码工作正常,但我的问题是它不应该抛出一些错误消息或任何信息吗?

public class MultiThreadJoinTest implements Runnable {

    public static void main(String[] args) throws InterruptedException {
        Thread a = new Thread(new MultiThreadJoinTest());
        a.start();
        Thread.sleep(5000);
        System.out.println("Begin");   
        System.out.println("End");
        a.join();
    }

    public void run() {
        System.out.println("Run");
    }
}

【问题讨论】:

  • 为什么要显示错误?
  • 查看join的代码。它检查 isAlive,所以它会返回。
  • 有些人有一种误解,认为join 会以某种方式导致线程被连接在一起并混合或什么的。事实上,它所做的只是等待其他线程终止(如果它还没有终止的话)。
  • documentation 没有提到如果线程已经终止则抛出异常。事实上,该措辞暗示在终止的线程上调用join() 将简单地返回。

标签: java multithreading java-threads


【解决方案1】:

如果您查看Thread::join 的源代码,您会注意到它调用了Thread::join(timeout) 方法。查看该方法的源代码,我们可以看到它通过调用Thread::isAlive 循环检查线程的状态:

...
if (millis == 0 L) {
    while (this.isAlive()) {
        this.wait(0 L);
    }
} else {
    while (this.isAlive()) {
        long delay = millis - now;
        if (delay <= 0 L) {
            break;
        }

        this.wait(delay);
        now = System.currentTimeMillis() - base;
    }
}
...

因此,如果您调用 join 的线程终止 - join 将返回并且什么也不做。

【讨论】:

    【解决方案2】:

    我正在重复其他答案和 cmets 中已经存在的信息,但让我尝试总结一下,同时添加解释。

    thread.join()的意义在于等待线程终止。这就是它在documentation for join 中告诉你的内容:

    等待此线程终止。

    等待终止的线程终止非常简单(!),并且似乎没有逻辑理由将等待终止的线程终止应视为错误。您想知道线程何时结束。它有。

    更重要的是,如果调用者必须确保线程在等待它终止之前没有终止,那将创建一个每个调用者都必须补偿的时间窗口。平凡的序列

     Thread t = new Thread(…);
     t.start();
     t.join();
    

    由于其固有的种族危险,很容易失败。换句话说,这将是设计join 的糟糕方式。

    【讨论】:

      【解决方案3】:

      不,如果线程已经死了,Thread.join() 会立即返回

      【讨论】:

        【解决方案4】:

        线程将开始执行。将打印 Run 然后线程将休眠 5 秒并打印 Begin following by End

        控制台输出:

        运行

        ---- 5 秒睡眠 ------

        开始

        结束

        【讨论】:

        • 不回答问题,这是关于join如果线程已经终止的行为/
        猜你喜欢
        • 1970-01-01
        • 2016-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-26
        • 2022-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多