方法join的作用是使所属的线程对象t正常执行run()方法中的任务,而使当前线程z进行阻塞,等待t销毁后再继续执行z后面的代码。
下面贴出join方法的源码:
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;
}
}
}
方法join()即调用join(0)。当millis为0时,会不停地判断线程t是否isAlive(),因此,未启动的线程和已经销毁的线程是不会阻塞当前线程的。
当所属线程t正在运行,在主线程z的cpu时段,会调用Object的wait()方法,该方法首先会取得线程t的锁,然后一直阻塞等待,直到被唤醒,然后继续判断isAlive()。当线程t运行完毕,主线程z获得t的锁,然后跳出while()循环,join方法结束。
这里需要明白的是,主线程z是怎么被唤醒的。当Thread对象执行start方法完成后,会产生一次thread.notifyAll()方法,此时主线程z被唤醒。
当线程z在调用t.join方法时,遇到了interrupt()方法,则会停止阻塞,抛出InterruptException异常。