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

原创粉丝点击