0

当我们在线程中使用 join 方法时,当前运行的线程会停止,并且另一个线程开始工作,条件是第一个线程将在第二个线程完成其工作后再次开始运行。如何做到这一点?第二个线程如何将对象锁传递给第一个线程?

4

1 回答 1

2

看实现

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); // timeout of 0 means forever
        }
    } else {
        while (isAlive()) {
            long delay = millis - now;
            if (delay <= 0) {
                break;
            }
            wait(delay);
            now = System.currentTimeMillis() - base;
        }
    }
}

所以当前Thread只是调用wait()另一个Thread,而另一个Thread还没有完成,即。isAlive()仍然返回true

请注意,方法是synchronized,否则我不确定您的意思

第二个线程如何将对象锁传递给第一个线程?

但是,当您调用wait()时,您会释放对象监视器,因此第三个Thread也可以join()在 this 上Thread

zch的其他详细信息:

join()方法最多等待几毫秒让该线程终止。超时 0 意味着永远等待。此实现使用以 为this.wait条件的调用循环this.isAlive。当一个线程终止时,该this.notifyAll方法被调用。建议应用程序不要在 Thread 实例上使用 wait、notify 或 notifyAll。这在没有系统支持的情况下无法完成(忙碌等待除外)。

于 2013-09-22T13:39:26.277 回答