标签:翻译 中文 value interrupt rup while ack jvm throws
源码分析:
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线程也就能继续跑下去了。
标签:翻译 中文 value interrupt rup while ack jvm throws
原文地址:http://www.cnblogs.com/java-wjf/p/7831633.html