1,方法的作用:
父线程等待子线程的执行。
如果是join或者join(0),即等待时长是0,父线程就会一直等到子线程执行结束,
如果是join(time),即等待时长是time数值,那父线程实际等待时长视情况而定:
第一种:子线程执行时长不需要time时长,那么父线程就可能不会等到time时长,为什么是可能呢?是不是要考虑其他线程(不包括父线程和子线程以外的线程),他也可能让父线程等待的,或者父线程没有获取到cpu时间片等原因。
第二种:子线程执行时长超过time时长,那么父线程的等待时长,至少是time时长,
2,源码分析:
1 public final synchronized void join(longmillis)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方法,是没任何效果的,此时子线程是死的。
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时长,父线程才会去执行。