如果目标尚未启动,Thread.join() 在 Java 中的行为是什么?

2022-09-04 21:15:50

在多线程 java 程序中,如果线程对象 T 已实例化,然后在线程启动之前调用了 T.join(),会发生什么情况?假设在 T 实例化之后的任何时间,在另一个线程调用 T.join() 之前或之后,其他一些线程可以调用 T.start()。

我问是因为我认为我有一个问题,在T.start()之前调用了T.join(),并且调用T.join()的线程挂起。

是的,我知道我有一些设计问题,如果得到解决,可能会使这成为一个非问题。但是,我想知道 join() 行为的细节,因为 Java API 文档唯一说的就是“等待此线程死亡”。


答案 1

它会回来的。请参阅下面的代码 - isAlive() 在线程启动之前将是 false,因此不会发生任何事情。

   public final synchronized void join(long millis) 
    throws InterruptedException {
    long base = System.currentTimeMillis();
    long now = 0;

    if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
    }

    if (millis == 0) {
        while (isAlive()) {
        wait(0);
        }
    } else {
        while (isAlive()) {
        long delay = millis - now;
        if (delay <= 0) {
            break;
        }
        wait(delay);
        now = System.currentTimeMillis() - base;
        }
    }
    }

代码片段是 © Copyright Oracle 2006 和/或其附属公司,可在此处找到。根据 Java 研究许可证授权


答案 2