Java主线程等待所有子线程执行完毕在执行,其实在我们的工作中经常的用到,比如说主线程要返回一个响应用户的值,但这个值得赋值过程是由过个子线程来完成的(模拟一个实际开发的情景),所以主线程必须等待子线程执行完毕,再响应用户;否则,响应用户的是一个无意义的值。

那么如何确保所有的子线程执行完毕了。一般的有如下方法:

1  让主线程等待,或着睡眠几分钟。用Thread.sleep()或者TimeUnit.SECONDS.sleep(5);

如下:

package andy.thread.traditional.test;import java.util.concurrent.TimeUnit;/*** @author Zhang,Tianyou* @version 2014年11月21日 下午11:15:27*/public class ThreadSubMain1 {public static void main(String[] args) {// TODO Auto-generated method stubfor (int i = 0; i < 10; i++) {new Thread(new Runnable() {public void run() {try {Thread.sleep(1000);// 模拟子线程任务} catch (InterruptedException e) {}System.out.println("子线程" + Thread.currentThread() + "执行完毕");}}).start();}try {// 等待全部子线程执行完毕TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("主线执行。");}}

效果如下:

子线程Thread[Thread-1,5,main]执行完毕
子线程Thread[Thread-3,5,main]执行完毕
子线程Thread[Thread-5,5,main]执行完毕
子线程Thread[Thread-7,5,main]执行完毕
子线程Thread[Thread-9,5,main]执行完毕
子线程Thread[Thread-0,5,main]执行完毕
子线程Thread[Thread-2,5,main]执行完毕
子线程Thread[Thread-4,5,main]执行完毕
子线程Thread[Thread-6,5,main]执行完毕
子线程Thread[Thread-8,5,main]执行完毕
主线执行。

此方主线程只是睡了5秒,但是不能保证全部的子线程执行完成,所以这儿的5秒只是一个估值。

2 使用Thread的join()等待所有的子线程执行完毕,主线程在执行

实现 如下:

package andy.thread.traditional.test;import java.util.Vector;/*** @author Zhang,Tianyou* @version 2014年11月21日 下午11:15:27*/public class ThreadSubMain2 {public static void main(String[] args) {// 使用线程安全的Vector Vector<Thread> threads = new Vector<Thread>();for (int i = 0; i < 10; i++) {Thread iThread = new Thread(new Runnable() {public void run() {try {Thread.sleep(1000);// 模拟子线程任务} catch (InterruptedException e) {}System.out.println("子线程" + Thread.currentThread() + "执行完毕");}});threads.add(iThread);iThread.start();}for (Thread iThread : threads) {try {// 等待所有线程执行完毕iThread.join();} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("主线执行。");}}

执行结果也是如下:

子线程Thread[Thread-1,5,main]执行完毕
子线程Thread[Thread-2,5,main]执行完毕
子线程Thread[Thread-0,5,main]执行完毕
子线程Thread[Thread-3,5,main]执行完毕
子线程Thread[Thread-4,5,main]执行完毕
子线程Thread[Thread-9,5,main]执行完毕
子线程Thread[Thread-7,5,main]执行完毕
子线程Thread[Thread-5,5,main]执行完毕
子线程Thread[Thread-8,5,main]执行完毕
子线程Thread[Thread-6,5,main]执行完毕
主线执行。

这种方式符合要求,它能够等待所有的子线程执行完,主线程才会执行。

3 使用ExecutorService线程池,等待所有任务执行完毕再执行主线程,awaitTermination

   awaitTermination(long timeout,TimeUnit unit)
          请求关闭、发生超时或者当前线程中断,无论哪一个首先发生之后,都将导致阻塞,直到所有任务完成执行。

package andy.thread.traditional.test;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;/*** @author Zhang,Tianyou* @version 2014年11月21日 下午11:15:27*/public class ThreadSubMain3 {public static void main(String[] args) {// 定义一个缓冲的线程值 线程池的大小根据任务变化ExecutorService threadPool = Executors.newCachedThreadPool();for (int i = 0; i < 10; i++) {threadPool.execute(new Runnable() {public void run() {try {Thread.sleep(1000);// 模拟子线程任务} catch (InterruptedException e) {}System.out.println("子线程" + Thread.currentThread() + "执行完毕");}});}// 启动一次顺序关闭,执行以前提交的任务,但不接受新任务。threadPool.shutdown();try {// 请求关闭、发生超时或者当前线程中断,无论哪一个首先发生之后,都将导致阻塞,直到所有任务完成执行// 设置最长等待10秒threadPool.awaitTermination(10, TimeUnit.SECONDS);} catch (InterruptedException e) {//e.printStackTrace();}System.out.println("主线执行。");}}

执行结果如下:

子线程Thread[pool-1-thread-4,5,main]执行完毕
子线程Thread[pool-1-thread-1,5,main]执行完毕
子线程Thread[pool-1-thread-7,5,main]执行完毕
子线程Thread[pool-1-thread-6,5,main]执行完毕
子线程Thread[pool-1-thread-5,5,main]执行完毕
子线程Thread[pool-1-thread-2,5,main]执行完毕
子线程Thread[pool-1-thread-3,5,main]执行完毕
子线程Thread[pool-1-thread-8,5,main]执行完毕
子线程Thread[pool-1-thread-10,5,main]执行完毕
子线程Thread[pool-1-thread-9,5,main]执行完毕
主线执行。

这种方法和方法2一样,将等待所有子线程执行完毕之后才执行主线程。

Java主线程等待所有子线程执行完毕再执行解决办法集相关推荐

  1. java主线程等待所有子线程执行完毕再执行

    java主线程等待所有子线程执行完毕在执行,这个需求其实我们在工作中经常会用到,比如用户下单一个产品,后台会做一系列的处理,为了提高效率,每个处理都可以用一个线程来执行,所有处理完成了之后才会返回给用 ...

  2. Java主线程等待所有子线程执行完毕再执行解决办法(转)

    方法一: Thread.join()方法,亲测可行,thread.join()方法 [java] view plain copy Vector<Thread> ts = new Vecto ...

  3. Java多线程、主线程等待所有子线程执行完毕、共享资源

    1.Java创建与启动线程 Java提供两种方式创建和启动线程:1.直接Thread类,2.实现Runable接口. 1.1  继承Thread类 public class myThread exte ...

  4. java 父线程_Java父线程(或是主线程)等待所有子线程退出的实例

    导读热词 实例如下: static void testLock1(){ final AtomicInteger waitCount = new AtomicInteger(30000); final ...

  5. 主线程等待所有子线程结束的4种方法

    目录 主线程不等待子线程全部结束 1.使用CountDownLatch 2.同步屏障CyclicBarrier 2.1.CyclicBarrier使用 2.2.CyclicBarrier复用 2.3. ...

  6. python 主程序等待 子线程_Python多线程中主线程等待所有子线程结束的方法

    Python多线程中主线程等待所有子线程结束的方法 发布时间:2020-07-30 14:39:04 来源:亿速云 阅读:77 作者:小猪 这篇文章主要讲解了Python多线程中主线程等待所有子线程结 ...

  7. 线程池如何保证所有子线程运行完再执行主线程

    Java主线程等待所有子线程执行完毕在执行,其实在我们的工作中经常的用到,比如说主线程要返回一个响应用户的值,但这个值得赋值过程是由过个子线程来完成的(模拟一个实际开发的情景),所以主线程必须等待子线 ...

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

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

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

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

  10. Thread:主线程等待子线程执行完毕再执行解决办法

    线程从启动到执行完毕,一般会有一些耗时操作,并不能像一般的程序语句,就能立马结束.如下代码: package com.xxx.async; public class WaitThreadDone {p ...

最新文章

  1. 小学生python-小学生都能学会的python(函数)
  2. 【数学与算法】步长一维搜索、梯度下降法、最速下降法、牛顿法
  3. 一不小心,我们办了场全球最 _____ 的技术大会......
  4. 压缩感知高斯测量矩阵matlab,浅谈压缩感知(十七):测量矩阵之有限等距常数RIC的计算...
  5. 星恒发布“超锂S7” 新品 采用第7代锰系多元复合锂技术打造
  6. aspnet登录界面代码_SAP系统基础操作培训1-环境登录介绍
  7. 单双号限行,今天是否绿色出行
  8. 【转载】Linux等类Unix系统学习用书那点事儿!
  9. 透明色的rgb值是多少_一文掌握PPT主题色原理及使用技巧
  10. layui中input、select、date日历的onchange事件无效 解决方法总结
  11. 题解(1-4)-----寒假练习赛(一)
  12. visio给图片添加任意形状外框
  13. python写一个定时关机软件
  14. 欧姆龙CP/CJ系列PLC包含哪些通讯方式呢?
  15. Web组态—低代码物联网组态平台
  16. 高斯赛德尔潮流计算c语言编程,高斯赛德尔法潮流计算
  17. 关于导弹飞行控制系统的滚转稳定
  18. MySQL 大表数据归档解决办法
  19. java 短连接转长连接_HTTP的长连接和短连接转换接口(API)
  20. 大会回顾丨游戏用户体验优化如何实践,看大咖怎么说(附PPT下载)

热门文章

  1. 算法:求树的最大深度104. Maximum Depth of Binary Tree
  2. 极客大学架构师训练营 网络通信协议 非阻塞网络I/O NIO 数据库架构原理 第16课 听课总结
  3. 私有api调用审核失败 prefs:root
  4. 如何测试java定时器_Java--定时器测试程序
  5. fluent设置uds c语言程序,FLUENT---UDS 计算流体停留时间(空气龄)
  6. 2021-09-1311. 盛最多水的容器 数组 双指针
  7. 计算机班英语试卷考法,计算机专业英语期末考试试卷A
  8. 《how to write and publis a scientific paper》 Chapter 3
  9. OpenCV-Python教程(6、Sobel算子)
  10. 逆向动态调试之Ollydbg的使用