Thread中的join方法主要的作用是让jion的线程加入当前线程,等加入的线程执行完之后才会执行当前线程。

接下来看个例子:

public class TestJoin {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() ->{try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("this is t1");});Thread t2 = new Thread(() -> {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("this is t2");});Thread t3 = new Thread(() -> {System.out.println("this is t3");});t1.start();t2.start();t3.start();t1.join();t2.join();t3.join();System.out.println("运行结束");}}

输出结果为:

this is t3
this is t1
this is t2
运行结束

可以看到输出是线程t1,t2,t3输出之后,才会输出到主线程。所以可以看出来join方法是把其他线程加入当前线程,等加入线程执行完之后才会执行当前线程。

如果想要t1,t2,t3再顺序输出,只需要在每个start方法后面再调用join就行了。这就就保证了每次主线程运行完一个线程,再去运行另外一个线程。

修改上面代码为:

public class TestJoin {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() ->{try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("this is t1");});Thread t2 = new Thread(() -> {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("this is t2");});Thread t3 = new Thread(() -> {System.out.println("this is t3");});t1.start();t1.join();t2.start();t2.join();t3.start();t3.join();System.out.println("运行结束");}}

输出为:

this is t1
this is t2
this is t3
运行结束

接下来我们再从源码分析下Thread的join方法是怎么实现的:

    public final void join() throws InterruptedException {join(0);}public final synchronized void join(long millis)throws InterruptedException {long base = System.currentTimeMillis();long now = 0;if (millis < 0) {throw new IllegalArgumentException("timeout value is negative");}if (millis == 0) {while (isAlive()) {wait(0);}} else {while (isAlive()) {long delay = millis - now;if (delay <= 0) {break;}wait(delay);now = System.currentTimeMillis() - base;}}}

由源码可以看到,其实底层就是wait方法,并且有一个while死循环,直到isAlive是False,也就是线程执行完成或者不存活。

顺带一提下Thread的yield的方法,此方法其实是只当前线程让出CPU回到就绪状态,线程再重新争抢CPU,但是结果可能是其他线程抢到CPU,也可能是自己抢到CPU。

Thread的join方法相关推荐

  1. 多线程中Thread的join方法

    多线程中Thread的join方法 join简介 join方法是Thread类中的一个方法,该方法的定义是等待该线程执行直到终止.其实就说join方法将挂起调用线程的执行,直到被调用的对象完成它的执行 ...

  2. 多线程--关于Thread的join方法

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.Thread的join方法. 二.方便理解引入例子 1.代码示例 2.输出结果 总结 一.Thread的join方法. ...

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

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

  4. Thread的join方法使用解析

    在C#中,Thread用的是比较多的,至少在windows form中使用是比较频繁的.一说到线程,可能马上就会想到界面和线程交互的头疼事,多线程之前数据共享,线程异步等等.这些当然是比较头疼的,只要 ...

  5. Thread 的join方法解释

    一.作用 Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行.具体看代码: public class JoinTest {public static void ...

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

    1,方法的作用: 父线程等待子线程的执行. 如果是join或者join(0),即等待时长是0,父线程就会一直等到子线程执行结束, 如果是join(time),即等待时长是time数值,那父线程实际等待 ...

  7. java join使用实例_Java多线程中关于join方法的使用实例解析

    先上代码 新建一个Thread,代码如下: package com.thread.test; public class MyThread extends Thread { private String ...

  8. JAVA多线程基础篇-join方法的使用

    1.概述 join()是Thread类中的一个方法,它的作用是将当前线程挂起,等待其他线程结束后再执行当前线程,即当前线程等待另一个调用join()方法的线程执行结束后再往下执行.通常用于在main主 ...

  9. Thread的start()和join()方法

    start: 用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码.通过调用Thread类的start()方法来启动一个线程,这时此线程处于就 ...

最新文章

  1. go语言实现简易ftp客户端
  2. .Net中XML,JSON的几种处理方式
  3. android 禁用dlsym_Android 7.0 dlopen 函数分析
  4. Problem Solving(POJ-3265)
  5. iPad开发(Universal Applications)
  6. 软件测试用例关键要素,软件测试用例的设计
  7. 分库分表中间件常见方案对比分析
  8. 计算机视觉学生论文,计算机视觉方面论文参考文献
  9. 交换机怎么和计算机连接网络打印机,怎么通过地址栏的方式连接网络打印机的方法?...
  10. Java使用多线程,UPD通过控制台之间互相通讯
  11. php5.6 oracle11,解决ORA-16055: FAL request rejected
  12. 解决模拟人生3(SIM 3)闪退问题
  13. 华为od机考真题-统计射击比赛成绩
  14. 《Computer Graphics with OpenGL》计算机图形学读书笔记 02——计算机图形学软件
  15. 使用Scrum进行敏捷项目管理的10个简单步骤
  16. PHP常用的文件操作函数集锦
  17. https安全证书提示证书风险怎么办
  18. “模型驱动”还不够!企业级低代码开发平台系统架构解密
  19. ScePT: 为规划的场景一致和基于策略轨迹预测
  20. ios快捷指令:一键登录/登出南京大学校园网

热门文章

  1. 即时战略游戏中实用的寻路算法分享
  2. 锁定计算机后怎么解锁,我的电脑IP被锁定了怎么办
  3. MySQL示例数据库sakila-db的安装导入
  4. 如何解决word文档打开总是显示修订状态问题
  5. 利用网络劫持解决微信远程真机调试Api问题
  6. 163个人邮箱怎么注册申请,电子邮箱免费注册,电子邮件管理大全
  7. 论文阅读笔记:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
  8. Linux安装mysql
  9. FPGA实现深度学习系列之FPGA的优势和劣势
  10. 教师办公用计算机统计表,XX中学计算机配备及多媒体教室统计表(规范化学校资料).doc...