前言:在工作项目中,有很多耗时处理都需要开多线程运行。简单的接口可以直接异步处理解决,但是对于一些业务逻辑复杂需要同步返回的这时候就需要用到以下三个多线程等待方法了。

1.  thread.join()

主线程等待子线程的终止。也就是说主线程的代码块中,如果碰到了t.join()方法,此时主线程需要等待(阻塞),等待子线程结束了(Waits for this thread to die.),才能继续执行t.join()之后的代码块。

案例:

public static void test1() throws InterruptedException {List<Thread> threadSet = new ArrayList<>();
    for (int i = 1; i < 10; i++) {Thread thread = new Thread(() -> {//线程执行
            System.out.println("子线程执行");
        });
        thread.start();
        threadSet.add(thread);
    }for (Thread thread : threadSet) {thread.join();
    }System.out.println("子线程执行完,主线程继续执行");
}

2.CountDownLatch

这个类使一个线程等待其他线程各自执行完毕后再执行。是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。

案例:

public static void test2() throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(10);
    for (int i = 0; i < 10; i++) {Thread thread = new Thread(() -> {//线程执行
            System.out.println("子线程执行");
            countDownLatch.countDown();
        });
        thread.start();
    }countDownLatch.await();
    System.out.println("子线程执行完,主线程继续执行");
}

3.CyclicBarrier

CyclicBarrier 的源码实现和 CountDownLatch 大同小异,CountDownLatch 基于 AQS 的共享模式的使用,而 CyclicBarrier 基于 Condition 来实现的。在CyclicBarrier类的内部有一个计数器,每个线程在到达屏障点的时候都会调用await方法将自己阻塞,此时计数器会减1,当计数器减为0的时候所有因调用await方法而被阻塞的线程将被唤醒。这就是实现一组线程相互等待的原理。

案例:

public static void test3() throws Exception {CyclicBarrier cyclicBarrier = new CyclicBarrier(10);
    for (int i = 0; i < 10; i++) {Thread thread = new Thread(() -> {//线程执行
            System.out.println("子线程执行");
            try {cyclicBarrier.await();
            } catch (Exception e) {e.printStackTrace();
            }});
        thread.start();
    }cyclicBarrier.await();
    System.out.println("子线程执行完,主线程继续执行");
}

CountDownLatch和CyclicBarrier的比较

  1. CountDownLatch是线程组之间的等待,即一个(或多个)线程等待N个线程完成某件事情之后再执行;而CyclicBarrier则是线程组内的等待,即每个线程相互等待,即N个线程都被拦截之后,然后依次执行。
  2. CountDownLatch是减计数方式,而CyclicBarrier是加计数方式。
  3. CountDownLatch计数为0无法重置,而CyclicBarrier计数达到初始值,则可以重置。
  4. CountDownLatch不可以复用,而CyclicBarrier可以复用。

java等待所有子线程执行完毕再执行相关推荐

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

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

  2. 【前端】等待异步任务js执行完毕再执行

    [前端]等待异步任务js执行完毕再执行 //页面加载完毕后执行 $(function(){console.info('---- 我是js代码 Start ----');//异步方法集合let prom ...

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

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

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

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

  5. python等待执行完毕 再继续执行_如何等待一个函数内部异步执行完毕再执行另外一个函数?...

    问题描述 有两个函数f1和f2,其中f1中有异步操作,执行完f1接着执行f2,因为f1内部有异步操作,所以会先执行完f2,再执行f1里的异步,如何等待f1异步执行完再执行f2. 备注:执行方式为f1( ...

  6. Promise.all等待方法执行完毕再执行

    1. p1,p2,p3需要先进行计算或者请求,等请求完成后,再执行Promise.all里的then(这个可以替代settimeout,毕竟settimeout不知道有些需要执行的时间) var p1 ...

  7. 关于 JS 中,实现在异步代码执行完毕再执行后续代码

    因为 js 是单线程,所有的同步任务要等前一个任务执行完毕,再执行下一个任务. function fn1() {console.log("fn1")fn2()fn3() }func ...

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

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

  9. ajax请求必须打断点才能成功,Jquery等待ajax执行完毕继续执行(断点调试正常,运行异常)...

    以前写过一个程序,发现用断点调试的时候,一步步的运行,程序是可以的,但是去了断点程序就出现了问题. $(document).ready(function(){ var arra=new Array() ...

最新文章

  1. 移动开发必须要了解的易盾加固生态
  2. 【项目管理和构建】——Maven简介(一)
  3. 耗费360万美元开发“无坚不摧”的电脑,美国这回下血本了!
  4. 狄慧201771010104《面向对象程序设计(java)》第十周学习总结
  5. STM32 - 定时器的设定 - 基础 01 - Timer Base - Prescaler description - Upcounting mode
  6. 名企笔试:京东 2016 算法工程师笔试题(登楼梯)
  7. vue自定义全局组件(或自定义插件)
  8. Linux编译LLVM,如何使用ninja快速编译LLVM和Clang(以llvm3.3为例子)
  9. Linux 压缩和解压
  10. cartographer探秘第四章之代码解析(六) --- 后端优化 --- 优化求解
  11. 教你如何使用Ip地址进行精准定位
  12. 我的世界 Unity3D MineCraft 用Unity3D制作类似MineCraft我的世界的游戏 洞穴算是完成了
  13. Women Feel Excited About The Beautiful Louis Vuitton Bags
  14. MySQL官方教程及各平台的安装教程和配置详解入口
  15. 计算机应用技术专业就业方向分析
  16. cmd 新增dns_win10在cmd中修改dns方法教程
  17. CodeForces 416C Booking System
  18. 让阿里再次伟大--钉钉如何长成独角兽的?
  19. 马云说完新零售,范驰开讲新店商
  20. 2020-12-16 垂死挣扎

热门文章

  1. pymilvus基操
  2. mysql求和语句月份,sql – 按月求和并将月份作为列
  3. 空间分析方法在计算机上的应用,空间分析
  4. Ubuntu将文件夹切换为英文
  5. 如何快速不借用转换工具将FLV格式视频转换成MP4
  6. 从头构建自己的Linux系统
  7. python 死循环捕捉输入异常
  8. 网络工程师必备技术汇总
  9. cadence SPB17.4 - Active Class and Subclass
  10. php checkbox多选框默认选中的实现。