等待线程终止的join方法

  • 在项目实践中经常会遇到一个场景,就是需要等待某几件事完成之后才能继续往下执行,比如线程加载资源等等。

    package com.heiye.learn1;
    
    public class JoinTest {
    public static void main(String[] args) throws InterruptedException {
    Thread threadOne=new Thread(new Runnable() {
    @Override
    public void run() {
    try{
    Thread.sleep(1000); } catch (InterruptedException e) {
    e.printStackTrace();
    } System.out.println("child threadOne over!");
    }
    }); Thread threadTwo=new Thread(new Runnable() {
    @Override
    public void run() {
    try{
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    } System.out.println("child threadTwo over!");
    }
    }); //启动子线程
    threadOne.start();
    threadTwo.start();
    System.out.println("wait all child thread over!"); //等待子线程执行完成,返回
    threadOne.join();
    threadTwo.join();
    System.out.println("all child thread over!");
    }
    }

  • 如上代码在主线程里面启动了两个线程,然后分别调用了它们的join方法,那么主线程首先会调用threadOne.join()执行完毕后返回,然后主线程调用threadTwo.join()方法后再次被阻塞,等待threadTwo执行完毕后返回。

  • 另外,线程A调用线程B的join方法会阻塞,当其他线程调用了线程A的Interrupt()方法中断了A时,线程A会抛出InterruptedException异常而返回。如下:

    package com.heiye.learn1;
    
    public class JoinTest2 {
    public static void main(String[] args) {
    Thread threadOne = new Thread(new Runnable() {
    @Override
    public void run() {
    System.out.println("threadOne begin run!");
    for (; ; ) { }
    }
    }); //获取主线程
    final Thread mainThread = Thread.currentThread(); //线程two
    Thread threadTwo = new Thread(new Runnable() {
    @Override
    public void run() {
    //休眠1秒
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    } //中断主线程
    mainThread.interrupt();
    }
    }); //启动线程one
    threadOne.start();
    //延迟1s启动线程two
    threadTwo.start(); try {//等待线程one结束
    threadOne.join();
    } catch (InterruptedException e) {
    //e.printStackTrace();
    System.out.println("main thread: " + e);
    }
    }
    }

  • 如上代码在threadOne线程里陷入死循环,主线程调用threadOne.join()方法阻塞自己等待线程threadOne执行完毕,在threadTwo休眠1s后会调用主线程的inerrupt()方法设置主线程的中断标志,从结果上来看,主线程的threadOne.join()会抛出InterruptedException异常,这里另外注意的是,在threadTwo里面调用的是是主线程的interupt()方法,而不是线程threadOne的。

最新文章

  1. 记账类APP竞品分析-挖财与随手记
  2. Atitit 常用比较复杂的图像滤镜 attilax大总结
  3. 关于token的杂记
  4. Google Kubernetes设计文档之服务篇-转
  5. 前端优化:RequireJS Optimizer 的使用和配置方法
  6. Div自适应高度的方法
  7. ASP.NET MVC+EasyUI+Entity FrameWork 整合开发
  8. LeetCode(5) - Longest Palindromic Substring
  9. C# is与as
  10. 从零开始学android开发- 应用程序窗体显示状态操作requestWindowFeature
  11. 那传说中的P、NP以及NPC问题
  12. 不同linux系统添加开机启动程序的命令
  13. MEF初体验之十一:查询组合容器
  14. js中的字符替换
  15. mongodb细讲
  16. python大法好——操作mysql
  17. 在虚拟机上运行zookeeper的过程中,xshell连接不上虚拟机
  18. Android与H5交互 原理与对比
  19. Error: Invalid or corrupt jarfile
  20. Python基础02_基本数据类型_以及while

热门文章

  1. hive -- 外部表、内部表、临时表
  2. apche的BeanUtils避免使用!
  3. playwright-python 截图、录制视频、录制接口(二)
  4. 实型(浮点型):float、double
  5. 存储系统管理(一)——Linux系统的设备和分区管理
  6. 剑指 Offer 14- II. 剪绳子 II
  7. Django的form组件基本使用——生成标签
  8. chrome插件开发学习(一)
  9. eBPF 安全项目 Tracee 初探
  10. Mysql常用sql语句(5)- as 设置别名