如果我加入终止的(死的)线程怎么办
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秒睡眠------
开始
结束
在这里,我试图在线程终止后加入它,代码工作正常,但我的问题是它不应该抛出一些错误消息或任何信息吗?
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秒睡眠------
开始
结束