您的位置:首页 > 其它

join方法的实现原理

2017-10-23 15:23 246 查看
重点: join方法在调用wait方法后, 并没有执行notify方法, 这个是在jvm中实现的, 一个线程执行结束后会执行该线程自身对象的notifyAll方法

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) {//这个分支是无限期等待直到b线程结束
while (isAlive()) {
wait(0);
}
} else {//这个分支是等待固定时间,如果b没结束,那么就不等待了。。。
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}


然后只说无限期等待的情况:while (isAlive()) {

//只要线程还活着,我等到天荒地老
wait(0);//wati操作,那必然有synchronized与之对应

}

再来看sychronized是谁public final synchronized void join(long millis)

成员方法加了synchronized说明是synchronized(this)......this是谁啊?看吧 bThread.join(0);    那说明this就是b线程对象本身。有了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();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: