为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

蓝山帝景 2023-06-08 19:49:25
在这里我试图在线程终止后加入线程,代码工作正常,但我的问题是它不应该抛出一些错误消息或任何信息吗?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");    }}
查看完整描述

4 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

如果您查看源代码,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将返回并且不执行任何操作。


查看完整回答
反对 回复 2023-06-08
?
慕哥9229398

TA贡献1877条经验 获得超6个赞

我尝试总结一下,同时添加解释。

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

等待这个线程结束。

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

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

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

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


查看完整回答
反对 回复 2023-06-08
?
守候你守候我

TA贡献1802条经验 获得超10个赞

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



查看完整回答
反对 回复 2023-06-08
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

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

控制台输出:

跑步

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

开始

结尾


查看完整回答
反对 回复 2023-06-08
  • 4 回答
  • 0 关注
  • 158 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信