java线程Thread的join方法。

Posted Zhengs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java线程Thread的join方法。相关的知识,希望对你有一定的参考价值。

1,方法的作用:

  父线程等待子线程的执行。

  如果是join或者join(0),即等待时长是0,父线程就会一直等到子线程执行结束,

     如果是join(time),即等待时长是time数值,那父线程等待时长视情况而定:

    第一种:子线程执行时长不需要time时长,那么父线程就可能不会等待到time时长,为什么是可能呢?是不是要考虑其他线程(不包括父线程,和子线程以外的线程),他也可能让父线程等待的(没有获取到cpu时间片等原因),

    第二种:子线程执行时长超过time时长,那么父线程的等待时长,至少是time时长,

2,源码分析:

 

 1  public final synchronized void join(long millis)
 2     throws InterruptedException {
 3         long base = System.currentTimeMillis();
 4         long now = 0;
 5 
 6         if (millis < 0) {
 7             throw new IllegalArgumentException("timeout value is negative");
 8         }
 9 
10         if (millis == 0) {
11             while (isAlive()) {
12                 wait(0);
13             }
14         } else {
15             while (isAlive()) {
16                 long delay = millis - now;
17                 if (delay <= 0) {
18                     break;
19                 }
20                 wait(delay);
21                 now = System.currentTimeMillis() - base;
22             }
23         }
24     }

  

    1.首先确定的是join方法的形参必须是大于零的数值,否则该方法抛出异常IllegalArgumentException("timeout value is negative");

   2. join(0),进入循环

       while (isAlive()) {

               wait(0);

      } 
     
那么isAlive是什么意思呢? isAlive是指子线程start并且run方法还没执行完,子线程是活着的,所以如果你在子线程start之前,调用join方法,是没任何效果的,此时子线程是死的。
  3.join(time),进入循环:
          while (isAlive()) {
          long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; }
   代码意思:

      第一种:子线程执行时长不需要time时长,那么父线程就可能不会等待到time时长,循环条件isAlive()=false,父线程出来了

      第二种:子线程执行时长超过time时长,那么父线程的等待时长,至少是time时长,父线程break出来的。

 

总结

  你要记住的唯一结论是:父线程肯定会等子线程执行一段时间,至于这段时间是多少?要区别看待,

  join(0)时:肯定是等到子线程执行完,父线程再执行;

    join(time)时:等到子线程执行完     或者    至少等time时长,父线程再执行。








以上是关于java线程Thread的join方法。的主要内容,如果未能解决你的问题,请参考以下文章

Java Thread.join()详解--父线程等待子线程结束后再结束

java线程Thread的join方法。

Java并发多线程编程——线程之间的通信之join()

java基础知识回顾之java Thread类学习--join方法的理解

Java多线程中的join方法

Thread线程join方法自我理解