Java并发之join原理解析
来源:互联网 发布:义隆单片机c语言教程 编辑:程序博客网 时间:2024/05/21 09:32
我们在进行Java并发,有时需要等某个其它线程(如名称为thA)执行完成后,才继续执行当前线程的后继工作,这时,我们可以通过在当前线程中执行thA.join(),这时当前线程即会在等待thA线程执行完毕后,继续后继代码的执行。
那么这其中的原理是什么呢,经过对相应源码的分析, 发现实现原理类似于wait(),即实际为join方法中调用了thA.wait()方法(注意这个join方法本身就是synchronized),这样当前线程即处于等待状态,必须执行thA.notify()或thA.notifyAll()才能唤醒,但实际工作上在thA执行完run方法后,并不需要执行thA.notify(),但后继代码也会被唤醒并执行了,这是什么原因呢?通过对Jvm natvie的源码分析,我们发现thread执行完成后,cpp的源码中会在thread执行完毕后,会调用exit方法,该方法中原来隐含有调用notify_all(thread)的动作:
void JavaThread::exit(booldestroy_vm,ExitTypeexit_type);//做清理啊收尾工作,
上面的方法中会调用 ensure_join(this);
下面是ensure_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);
lock.notify_all(thread); //这里执行了notify_all,进行了wait的唤醒
thread->clear_pending_exception();
}
通过以上分析后,我们就可以有了join的替代写法:
synchronized(thA) {
thA.wait();
}
不过这种写法没有join写法简洁.
阅读全文
0 0
- Java并发之join原理解析
- java并发 java7之fork-join框架
- java并发之Fork/Join实例
- java并发之Fork/Join框架
- Java并发之Fork-Join框架
- 【Java并发编程】Join
- 【Java并发】- ConcurrentHashMap原理解析(JDK1.8)
- Java concurrent Framework并发之fork-join框架分析
- java并发(二十五)java7之fork-join框架
- Java并发编程系列之二十:Fork/Join框架
- 【Java并发】(二) 线程同步之Thread.join()、CountDownLatch、CyclicBarrier
- Java并发编程之volatile、synchronized、yield、join
- java join使用原理
- Java并发编程之ConcurrentHashMap原理分析
- java并发之SynchronousQueue实现原理
- Java并发之synchronized实现原理
- Java 并发之 ScheduledThreadPoolExecutor 原理分析
- Java并发-Fork/Join框架
- spring boot-部署时报org.springframework.beans.factory.BeanCreationNotAllowedException异常
- [置顶] RecyclerView实现瀑布流,图片自适应高度
- 【Linux】 JDK安装及配置 (tar.gz版)
- 瑞萨基础学习之----PWM输出
- 在Activity中定义颜色
- Java并发之join原理解析
- ZooKeeper 安装部署
- 最详尽的DrawerLayout用法
- 在windows下conda install lda
- linux面试题目(五)
- IP基础知识 主机地址和网络地址
- mysql查询每天每周每月每年的数据方法
- C++链表实现二叉树
- vs2013+open1.0环境配置