如果我加入终止的(死的)线程怎么办

What if I join the terminated(dead) thread

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

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");
    }
}

不,Thread.join() 将 return 如果线程已经死了

如果您查看 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 将只是 return 并且什么都不做。

我重复了其他答案和评论中已有的信息,但让我尝试总结一下,同时添加解释。

thread.join()的重点是等待线程终止。这就是它在 documentation for join:

中告诉你的

Waits for this thread to die.

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

更重要的是,如果调用者必须确保线程在等待线程终止之前没有终止,这将创建每个调用者都必须补偿的计时 window。琐碎的序列

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

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

线程将开始执行。将打印 运行 然后线程将休眠 5 秒并打印 Begin 和 End

控制台输出:

运行

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

开始

结束