源码分析:
public final synchronized(this) 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);//wait操作,必然有synchronized与之对应
}
} else {//等待固定的一段时间,如果子线程还没有结束,不再继续等待子线程。子线程进入资源竞争模式
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
大家都知道,有了wait,必然有notify,我刚保证楼主在整个jdk里面都不会找到对b线程对象的notify操作。这就要看jvm代码了
//一个c++函数:
void JavaThread::exit(bool destroy_vm, ExitType exit_type) ; //这家伙是啥,就是一个线程执行完毕之后,jvm会做的事,做清理啊收尾工作, //里面有一个贼不起眼的一行代码,眼神不好还看不到的呢,就是这个: ensure_join(this); //翻译成中文叫 确保_join(这个);代码如下: static void ensure_join(JavaThread* thread) { Handle threadObj(thread, thread->threadObj()); ObjectLocker lock(threadObj, thread); thread->clear_pending_exception(); java_lang_Thread::set_thread_status(threadObj(), java_lang_Thread::TERMINATED); java_lang_Thread::set_thread(threadObj(), NULL); //同志们看到了没,别的不用看,就看这一句,妈了个淡淡, //thread就是当前线程,是啥是啥?就是刚才说的b线程啊。 lock.notify_all(thread); thread->clear_pending_exception(); }
至此,b线程对象被notifyall了,那么a线程也就能继续跑下去了。