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写法简洁.

你可能感兴趣的:(JAVA)