CountDownLatch__让某一条线程等待其它线程执行完毕后再执行
2023-04-18 15:35:09 时间
使用场景:让某一条线程等待其它线程执行完毕后再执行。
CountDownLatch cdl = new CountDownLatch(3):参数是等待线程的数量,并定义了一个计时器;
await():让线程等待,当计时器为0时,唤醒线程;
countDown():线程执行完毕时调用,计时器会减1;
案例:妈妈有三个孩子,三个孩子吃饺子,等三个孩子都吃完饺子妈妈才能收拾桌子
public class CountDownLatchDemo { public static void main(String[] args) { // 创建CountDownLatch对象,需要传递给4个线程,ChildThread1、2、3代码相同 CountDownLatch cdl = new CountDownLatch(3); // 创建4个线程对象开启它们 MotherThread mt = new MotherThread(cdl); mt.start(); ChildThread1 t1 = new ChildThread1(cdl); ChildThread2 t2 = new ChildThread2(cdl); ChildThread3 t3 = new ChildThread3(cdl); t1.setName("小红"); t2.setName("小明"); t3.setName("小刚"); t1.start(); t2.start(); t3.start(); } }
public class MotherThread extends Thread { private CountDownLatch countDownLatch; public MotherThread(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } @Override public void run() { try { // 1、等孩子吃完,当计时器为0时,会自动唤醒这里等待的线程 countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } // 2、三个孩子都吃完了开始收拾 System.out.println("开始收拾了!"); } }
public class ChildThread1 extends Thread { private CountDownLatch countDownLatch; public ChildThread1(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } @Override public void run() { // 1、吃饺子 for (int i = 1; i < 11; i++) { System.out.println(getName() + "开始吃第" + i + "个饺子"); } // 2、吃完给妈妈说一声,计时器会减1 countDownLatch.countDown(); } }
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击