java 线程 thread.join_java线程Thread的join方法。

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时长,父线程才会去执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值