join方法的实现原理
2017-10-23 15:23
246 查看
重点: join方法在调用wait方法后, 并没有执行notify方法, 这个是在jvm中实现的, 一个线程执行结束后会执行该线程自身对象的notifyAll方法
然后只说无限期等待的情况: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();
}
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();
}
相关文章推荐
- join方法的实现原理
- 深入理解join方法的实现原理
- 数据加密原理与实现方法
- OGC Web Map Service标准的实现原理与方法(1)
- CRC算法原理及C语言实现(介绍了3种方法)
- java双缓冲原理和实现 消除闪烁的常用方法
- Taglib原理和实现 第六章:标签内常用方法总结
- [整理]二分查找搜索算法原理及递归,迭代方法实现
- MmMapIoSpace以及MmUnmapIoSpace,VirtualAlloc和VirtualCopy 函数的实现原理以及实现方法
- 了解MmMapIoSpace以及MmUnmapIoSpace函数的实现原理以及实现方法
- 根据RemObject的远程方法调用原理实现的简单远程方法调用
- 数据加密原理与实现方法
- Java数据结构之双端链表原理与实现方法
- 了解MmMapIoSpace以及MmUnmapIoSpace函数的实现原理以及实现方法
- MySQL 中 Join 的基本实现原理
- .Net 加密原理,方法体加密信息对应关系的实现(一)
- RunDll32 的使用方法与实现原理
- 一种快速的未登陆词识别方法(原理和实现)
- MmMapIoSpace以及MmUnmapIoSpace,VirtualAlloc和VirtualCopy 函数的实现原理以及实现方法
- 一种快速的未登陆词识别方法(原理和实现)