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时长,父线程再执行。
时间: 2024-10-10 09:30:11