猿问

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

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


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

    }

}


蓝山帝景
浏览 159回答 4
4回答

慕尼黑8549860

如果您查看源代码,Thread::join您会注意到它调用了Thread::join(timeout)方法。查看此方法的源代码,我们可以看到它通过调用循环检查线程的状态Thread::isAlive:...if (millis == 0 L) {&nbsp; &nbsp; while (this.isAlive()) {&nbsp; &nbsp; &nbsp; &nbsp; this.wait(0 L);&nbsp; &nbsp; }} else {&nbsp; &nbsp; while (this.isAlive()) {&nbsp; &nbsp; &nbsp; &nbsp; long delay = millis - now;&nbsp; &nbsp; &nbsp; &nbsp; if (delay <= 0 L) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; this.wait(delay);&nbsp; &nbsp; &nbsp; &nbsp; now = System.currentTimeMillis() - base;&nbsp; &nbsp; }}...因此,如果您调用的线程join终止 -join将返回并且不执行任何操作。

慕哥9229398

我尝试总结一下,同时添加解释。的要点thread.join()是等待线程终止。这就是它在join 文档中告诉您的内容:等待这个线程结束。等待已终止的线程终止非常简单(!),并且似乎没有合乎逻辑的理由将等待已终止的线程终止视为错误。您想知道线程何时结束。它有。更重要的是,如果调用者必须确保线程在等待它终止之前没有终止,这将创建一个每个调用者都必须补偿的计时窗口。琐碎的序列 Thread t = new Thread(…);  t.start();  t.join();由于其固有的种族危险,很容易失败。换句话说,那将是一种糟糕的设计方式join。

守候你守候我

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

牧羊人nacy

线程将开始执行。将打印 Run 然后线程将休眠 5 秒,然后打印 Begin 和 End控制台输出:跑步---- 5秒睡眠------开始结尾
随时随地看视频慕课网APP

相关分类

Java
我要回答