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



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

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的源代码,你会注意到它调用了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只会返回并且不执行任何操作。

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

thread.join()的重点是等待线程终止。这就是它在 join 文档中告诉您的内容:

等待此线程死亡。

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

更重要的是,如果调用方必须确保线程在等待其终止之前未终止,这将创建一个每个调用方都必须补偿的计时窗口。琐碎的序列

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

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

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

线程将开始执行。 将打印运行,然后线程将休眠 5 秒钟并打印 开始跟随结束

控制台上的输出:

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

开始

结束

相关内容

最新更新