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

java 线程 thread.join_java线程Thread的join方法。相关推荐

  1. java wait 参数_java中wait()和join()方法的区别是什么

    java中wait()和join()方法的区别是:存在不同的java包中:wait()方法用于线程间通信,它所施加的等待状态的线程可以被启动:join()方法用于在多个线程之间添加排序,它所施加的等待 ...

  2. java thread join_java中thread的join方法为什么能让线程插队

    在面试中经常会遇到这样的问题:在主线程中有两个子线程,如果能让着两个子线程能顺序的执行? 答案自然是用join来使得两个线程顺序执行,先看一下具体代码 public class ThreadOfJoi ...

  3. Thread源码分析之join方法

    2019独角兽企业重金招聘Python工程师标准>>> join方法示例1 源码 import java.util.concurrent.TimeUnit;public class ...

  4. 线程状态以及sleep yield wait join方法

    前言 在日常的开发过程中,我们通过会使用Thread.sleep模拟一个耗时的任务执行过程. 在深入理解这四个方法之前,首先对线程的状态进行理解阐述. 线程概念 线程是操作系统执行任务的基本单位,处理 ...

  5. java线程join方法

    java线程join方法 1.join方法 ​ join方法的作用是进行线程插队,也就是说调用了join方法的线程相对于调用它的上级线程拥有跟高的执行权.调用join方法的线程的上级线程必须等待调用j ...

  6. 模拟做饭系统(java+线程中的join方法)

    (一)项目框架分析 妈妈要去做饭,发现没有酱油,让儿子去买酱油,然后回来做饭. 根据面向对象的思想,有两个对象,妈妈和儿子 主要有两个方法: (一)没有线程控制(即儿子没有买酱油回来妈妈就做好饭了)+ ...

  7. java 钩子线程_java-钩子线程

    在线上Java程序中经常遇到进程程挂掉,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码.Java中得ShutdownHook提供了比较好的方案. JDK在1.3之后提 ...

  8. 额!Java中用户线程和守护线程区别这么大?

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 在 Java 语言中线程分为两类:用户线程和守护线程,而二者之间的区别却鲜有人知, ...

  9. java 多线程编程(包括创建线程的三种方式、线程的生命周期、线程的调度策略、线程同步、线程通信、线程池、死锁等)

    1 多线程的基础知识 1.1 单核CPU和多核CPU 单核CPU,其实是一种假的多线程,因为在一个时间单元内,也只能执行一个线程的任务.微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那 ...

最新文章

  1. 同步SQL Server 2000 数据库
  2. 自主互助四环节之计算机教案,自主互助学习型课堂的实施方案
  3. Swift 3.0 beta 6权限访问修改
  4. c语言快速排序案例,什么是快速排序?C语言数组快速排序例子
  5. javax.validation.ValidationException: Unable to find a default provider
  6. mongodb 分组聚合_mongodb 聚合命令
  7. CentOS7安装详解
  8. B00016 交换变量a和b的值
  9. 局域网ip冲突检测工具_“网络工程师培训”基础教程五:局域网
  10. angularjs外部文件中的控制器使用
  11. Vivado 2019使用教程
  12. 浅谈非数学类全国大学生数学竞赛
  13. 某云盘下载工具(IDM,Aria2)速度测试
  14. 最全移动端UI设计规范,作为前端的你,了解多少?
  15. 客户开发篇 | 外贸业务员怎么打电话开发跟进客户呢?
  16. html 原始数据类型,JS原始数据类型-String
  17. windows 远程 登录无操作30分钟后自动退出登录_【计时优易学车远程教育学习流程】...
  18. tplink支持Linux的无线网卡,Ubuntu 8.04下安装TP-Link TL-WN-322G+ 1.0 无线网卡
  19. 国内android开发之墙痛,Android面试题-机型适配之痛,例如三星、小米、华为、魅族等。...
  20. Java修道之路,问鼎巅峰,我辈代码修仙法力齐天

热门文章

  1. “智慧血联网平台”亮相军民融合技术装备博览会
  2. Java反射 - 私有字段和方法
  3. SystemTap了解
  4. 共享文件时提示“将安全性信息应用到以下对象时发生错误”
  5. Linux堆内存管理深入分析(上)
  6. 比特币的货币属性是什么?
  7. 机器学习中的三对性能度量参数
  8. 什么BRIEF算法?BRIEF算法详解
  9. springMVC出现HTTP Status 405 - Request method 'GET' not supported错误的解决方法
  10. react es6+ 代码优化之路-1