Java并发之join原理解析

        我们在进行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写法简洁.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值