join方法的原理和应用

源码分析:

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线程也就能继续跑下去了。

posted @ 2017-11-14 11:30  小疯子的博客  阅读(243)  评论(0编辑  收藏  举报