在多线程中,控制并发的手段有很多,如何保证线程按照我们想要的顺序去执行呢? 今天使用CountDownLatch 和 CompletableFuture来简单操作一下.

例题: 三个线程 a b c 实现 a->b->c 的执行顺序。

CountDownLatch解法
public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatchA = new CountDownLatch(1);CountDownLatch countDownLatchB = new CountDownLatch(1);Thread a = new Thread(()->{// 输出a的ascii码值log.info(Thread.currentThread().getName()+"  "+(int)'a');countDownLatchA.countDown();},"a");Thread b = new Thread(()->{try {// 等待a执行完毕// 等待计数器归0 然后再向下执行countDownLatchA.await();// 输出b的ascii码值log.info(Thread.currentThread().getName()+"  "+(int)'b');countDownLatchB.countDown();} catch (InterruptedException e) {e.printStackTrace();}},"b");Thread c = new Thread(()->{try {// 等待b执行完毕// 等待计数器归0 然后再向下执行countDownLatchB.await();// 输出c的ascii码值log.info(Thread.currentThread().getName()+"  "+(int)'c');} catch (InterruptedException e) {e.printStackTrace();}},"c");c.start();b.start();a.start();}

结果:

CompletableFuture解法
public static void main(String[] args) {// 三个线程   异步变同步CompletableFuture<Void> aRes = CompletableFuture.runAsync(()->{// 输出a的ascii码值System.out.println("第一步:a"+(int)'a');});CompletableFuture<Void> bRes = aRes.thenRun(()->{// 输出b的ascii码值System.out.println("第二步:b"+(int)'b');});CompletableFuture<Void> cRes = bRes.thenRun(()->{// 输出c的ascii码值System.out.println("第三步:c"+(int)'c');});}

结果:

参考 大神博客

第三种 参考 大神博客

CountDownLatch 和 CompletableFuture 和 (ReentrantLock和Condition)的简单应用相关推荐

  1. ReentrantLock和Condition理解及应用

    Condition: Condition是一个多线程间协调通信的工具类,使得某个,或者某些线程一起等待某个条件(Condition),只有当该条件具备( signal 或者 signalAll方法被带 ...

  2. Java多线程(九)之ReentrantLock与Condition

    一.ReentrantLock 类 1.1 什么是reentrantlock java.util.concurrent.lock 中的 Lock 框架是锁定的一个抽象,它允许把锁定的实现作为 Java ...

  3. Java 多线程 —— ReentrantLock 与 Condition

    引言 ReentrantLock 是 JUC 下的一个功能强劲的锁工具,支持公平锁.非公平锁,以及多等待队列的 Condition . 也常常被称为"手动锁".本篇博客主要分析它的 ...

  4. Lock锁中ReentrantLock中Condition的使用

    package com.lezu.springboot.controller;import java.util.concurrent.locks.Condition; import java.util ...

  5. ReentrantLock的Condition条件实现精确唤醒某个线程

    /*** 描述: 介绍Reentrantlock的condition条件可以实现精确唤醒某个线程* 题目:多线程之间按顺序调用,实现A->B->C三个线程启动,要求AA打印5次BB打印10 ...

  6. JUC并发编程:Condition的简单理解与使用

    目录 1:概述 2:举例 3:condition 的一些方法 1:概述 Condition本质上是一个接口,Condition因素与Object监视器方法( wait , notify和notifyA ...

  7. Java多线程中使用ReentrantLock、synchronized加锁 简单举例

    Java多线程中使用ReentrantLock.synchronized加锁 简单举例 public class Demo {final static Lock lock = new Reentran ...

  8. Java进阶:ReentrantLock和Condition基本使用

    文章目录 1. 概述 2. 加锁解锁 3. Condition 3.1 await/signal 3.2 awaitNanos 1. 概述 Java除了使用synchronized锁之外,还可以使用R ...

  9. JDK1.8源码分析:可重入锁ReentrantLock和Condition的实现原理

    synchronized的用法和实现原理 synchronized实现线程同步的用法和实现原理 不足 synchronized在线程同步的使用方面,优点是使用简单,可以自动加锁和解锁,但是也存在一些不 ...

最新文章

  1. Android平台开源项目
  2. python流程控制-实战案例手把手教你Python流程控制技巧
  3. The application may be doing too much work on its main thread.
  4. 如何关闭Struts2的webconsole.html
  5. 【HDU - 5917】Instability(规律,结论,Ramsey定理,知识点,tricks)
  6. Qt入门(11)——Qt插件
  7. springcloud断点续传源码_两套SpringCloud版的开源项目,项目源码和教程齐全
  8. java rt.jar的源代码的位置
  9. java 利用Scanner解析逗号字符串
  10. 什么是特洛伊木马病毒?
  11. 6、深思数盾加密狗使用小记
  12. No handler found for OPTIONS /lca/lcaplan/lcaplanprocess/list
  13. 基于FPGA的光纤数据传输
  14. 多张表格链接一起——《超级处理器》应用
  15. 事务四大特征:(原子性、一致性、隔离性、持久性)
  16. 晕LIVEnbsp;WRITER设置教程是网易…
  17. loadrunner12录制事件一直卡在11就不动了,大佬们,求助啊!!!
  18. 数据可视化——彩色通用设计之色彩搭配(制作对色盲人群友好的图形和演示)
  19. 调整autocad字体输入框大小
  20. 移远公司 NB-IoT模块AT指令详细解释

热门文章

  1. jsp+ssm计算机毕业设计超市库存管理系统【附源码】
  2. Presto客户端命令
  3. sidecar pattern
  4. 果粉看了别哭!回顾iPhone历代问题门,最后一个亮了
  5. html歌曲朋友圈,为何有的人喜欢在朋友圈里分享歌曲,他们都是些什么人?长见识了...
  6. 如何创建并保存网页ico图标
  7. elasticsearch整合springBoot
  8. recovery 强制执行恢复出厂设置(Rescue Party)
  9. wireshark解析TCP的几种状态 (SYN, FIN, ACK, PSH, RST, URG)
  10. QPCore Service 是什么?是否可以禁用?如何彻底删除它?