有人可以解释Java Thread类中的join方法吗?

    public final synchronized void join(long millis) throwsInterruptedException {
    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;
        }
    }
}

wait(0)如何使主线程等待直到完成.线程正在调用自身等待吗?据我了解,它本身必须具有锁定才能调用wait()方法?完成时如何通知主线程?

解决方法:

documentation解释了逻辑:

This implementation uses a loop of this.wait calls conditioned on this.isAlive. As a thread terminates the this.notifyAll method is invoked. It is recommended that applications not use wait, notify, or notifyAll on Thread instances.

因此,此实现依赖于以下事实:Thread对象不仅代表线程,而且还像Java中的其他任何对象一样是对象.这样,它从Object继承,具有自己的监视器,并且可以同步,让线程在其上等待,等等.

It must have a lock on itself to call wait() method?

是.实际上,此方法被声明为同步.因此,它在Thread实例本身上进行同步.进入其中后,便有了Thread实例的监视器.然后,在调用wait时,您将其放弃,以便其他线程可以执行相同的操作.

这可能有点令人困惑.您当前正在运行的线程是线程A.您正在线程B上使用join.在此处同步的对象是线程B的实例,这使线程A等待,直到在同一(B)实例上调用notifyAll为止.

线程B完成后,它将在其自己的实例上调用notifyAll.因此,将通知在等待线程B的实例中阻塞的任何线程.

上一篇:[TLPI] C30 Threads: Thread Synchronization


下一篇:java-从多个线程调用时Thread.sleep()如何工作