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 onthis.isAlive
. As a thread terminates thethis.notifyAll
method is invoked. It is recommended that applications not usewait
,notify
, ornotifyAll
onThread
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的实例中阻塞的任何线程.