码迷,mamicode.com
首页 > 编程语言 > 详细

java线程Thread的join方法。

时间:2017-02-25 12:09:15      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:异常   div   art   wait   except   循环   new   其他   nal   

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方法。

标签:异常   div   art   wait   except   循环   new   其他   nal   

原文地址:http://www.cnblogs.com/javazs/p/6441234.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!