线程从启动到执行完毕,一般会有一些耗时操作,并不能像一般的程序语句,就能立马结束。如下代码:

package com.xxx.async;
public class WaitThreadDone {public static void main(String[] args) {Thread t1 = new Thread(new Runnable() {   @Overridepublic void run() {try {System.out.println("thread "+Thread.currentThread().getName()+" start to run.");Thread.sleep(2000);System.out.println("thread " + Thread.currentThread().getName() + " done.");} catch (Exception e) {e.printStackTrace();}}});       System.out.println("main start to run.");t1.start();System.out.println("main done.");}
}

这是一个典型的线程耗时操作,默认情况下,线程t1它不会立马结束,因此执行结果就是:

我们希望主线程开始之后,等待子线程运行结束,主线程继续执行。

考虑子线程是一个耗时的阻塞操作,我们需要通过程序让子线程运行结束再执行主线程。这里给出如下几种解决办法:

①、t1.join()
②、while(t1.isAlive())
③、while(Thread.activeCount()>1)
④、CountDownLatch

下面来看看具体的实现:

第一种办法:t1.start();后面接上t1.join()代码,如下:

第二种办法:判断子线程是否还存活

第三种办法:判断活跃的线程是否大于1

第四种办法:通过同步工具类CountDownLatch实现

这种办法需要CountDownLatch对象侵入线程run()方法的代码中。最终执行结果和前面几种解决办法一致。

CountDownLatch通过await()方法阻塞主线程,等待其他线程运行结束,通过countDown()方法来释放锁,主线程开始执行。

总结:在这四种解决办法中,一、二两种办法需要知道线程的名字,当有很多线程同时执行的时候,有时候,我们是无法直观的知道每个线程的名字,这两个办法用的很少见。第四种办法在多线程的情况下也可以使用,就是需要设置CountDownLatch latch = new CountDownLatch(n),指定需要等待的线程数。第三种办法无需知道线程的名字和线程的数量,使用起来很直观。

Thread:主线程等待子线程执行完毕再执行解决办法相关推荐

  1. 【多线程】学习记录七种主线程等待子线程结束之后在执行的方法

    最近遇到一个问题需要主线程等待所有的子线程结束,才能开始执行,统计所有的子线程执行结果,返回,网上翻阅各种资料,最后记录一下,找到七种方案 第一种:while循环 对于"等待所有的子线程结束 ...

  2. 如何实现java主线程等待子线程执行完毕之后再执行?

    本文转自:问题:如何实现java主线程等待子线程执行完毕之后再执行? - jseven - 博客园 点击关注强哥,查看更多精彩文章呀 工作总往往会遇到异步去执行某段逻辑, 然后先处理其他事情, 处理完 ...

  3. c++主线程等待子线程结束_简单明了的 Python 多线程来了 | 原力计划

    作者 | 万里羊责编 | 王晓曼出品 | CSDN博客线程和进程计算机的核心是CPU,它承担了所有的计算任务,就像是一座工厂在时刻运行.如果工厂的资源有限,一次只能供一个车间来使用,也就是说当一个车间 ...

  4. Java多线程之----主线程会等待子线程结束再结束么,怎么让主线程等待子线程结束呐?

    首先给出结论: 主线程和子线程之间没有谁先谁后结束这种关联,它们只是各自负责自己的线程任务,如果该线程的任务结束了,该线程自然会结束运行. talk is cheap,show me the code ...

  5. java 主线程等待_Java实现主线程等待子线程

    本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明: 1.使用Thread的join()方法,join()方法会阻塞主线程继续向下执行. 2.使用Java.util.concurrent中的C ...

  6. Java并发编程原理与实战六:主线程等待子线程解决方案

    Java并发编程原理与实战六:主线程等待子线程解决方案 参考文章: (1)Java并发编程原理与实战六:主线程等待子线程解决方案 (2)https://www.cnblogs.com/pony1223 ...

  7. java等待5秒_Java并发编程-主线程等待子线程解决方案

    主线程等待所有子线程执行完成之后,再继续往下执行的解决方案 public class TestThread extends Thread { public void run() { System.ou ...

  8. Java主线程等待子线程、线程池

    public class TestThread extends Thread { public void run() { System.out.println(this.getName() + &qu ...

  9. 【Java并发编程】主线程等待子线程的多种方法

    文章目录 1.Thread sleep() 2.Thread join() 3.synchronized 等待唤醒机制 4.ExecutorService isTerminated() + while ...

最新文章

  1. Vue 第一天: 计算属性和观察者
  2. 阿里云数据库备份DBS商业化发布,数据库实时备份到OSS
  3. 配置System Center Data Protection Manager 2007
  4. QT的QEasingCurve类的使用
  5. 给 WordPress 博客添加随机文章的3个方法
  6. Sublime text 3 SVN插件及使用方法
  7. 《三层架构之抽象工厂加反射》纠错
  8. 基于STM32F103RCT6的AD9833驱动开发(代码可以免费发邮箱)
  9. 【Leetcode】1101. The Earliest Moment When Everyone Become Friends
  10. 手游人类一败涂地联机一直连接服务器,人类一败涂地手游怎么联机
  11. 记一次惊险的文件恢复经历Eclipse saved my day
  12. 计算机编程辅导班,昆明少儿计算机编程辅导班
  13. Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.7.0:repackage (repackage)
  14. 反演产品的精度和空间分辨率
  15. Qt|layout布局相关,layout属性的含义及使用
  16. 2018年 吉林大学 软件工程 967考研经验分享
  17. 日语翻译器-日语翻译器软件-日语翻译器排行榜
  18. 伽利略红十字来信谭之一:哈勃红歌红限红移谭
  19. CLion调试redis6源码
  20. 计算机与信息与计算科学的论文,信息与计算科学专业论文参考文献

热门文章

  1. Linux网络编程经典书籍推荐
  2. 明年起无CDN牌照的CDN服务商将禁止提供服务
  3. Dask简介(python)
  4. 【硬盘数据恢复】硬盘加电有异响,经检测是磁头损坏故障的硬盘数据恢复
  5. 业内指路共享软件:更多机会在移动和海外市场(二)
  6. 什么是刷机、线刷、卡刷
  7. 【HDU4276】The Ghost Blows Light
  8. 原生app 为什么要嵌入h5
  9. 技术改变生活:华为十大发明
  10. 谷歌地球(Google Earth)入门技巧