CountDownLatch 和 CompletableFuture 和 (ReentrantLock和Condition)的简单应用
在多线程中,控制并发的手段有很多,如何保证线程按照我们想要的顺序去执行呢? 今天使用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)的简单应用相关推荐
- ReentrantLock和Condition理解及应用
Condition: Condition是一个多线程间协调通信的工具类,使得某个,或者某些线程一起等待某个条件(Condition),只有当该条件具备( signal 或者 signalAll方法被带 ...
- Java多线程(九)之ReentrantLock与Condition
一.ReentrantLock 类 1.1 什么是reentrantlock java.util.concurrent.lock 中的 Lock 框架是锁定的一个抽象,它允许把锁定的实现作为 Java ...
- Java 多线程 —— ReentrantLock 与 Condition
引言 ReentrantLock 是 JUC 下的一个功能强劲的锁工具,支持公平锁.非公平锁,以及多等待队列的 Condition . 也常常被称为"手动锁".本篇博客主要分析它的 ...
- Lock锁中ReentrantLock中Condition的使用
package com.lezu.springboot.controller;import java.util.concurrent.locks.Condition; import java.util ...
- ReentrantLock的Condition条件实现精确唤醒某个线程
/*** 描述: 介绍Reentrantlock的condition条件可以实现精确唤醒某个线程* 题目:多线程之间按顺序调用,实现A->B->C三个线程启动,要求AA打印5次BB打印10 ...
- JUC并发编程:Condition的简单理解与使用
目录 1:概述 2:举例 3:condition 的一些方法 1:概述 Condition本质上是一个接口,Condition因素与Object监视器方法( wait , notify和notifyA ...
- Java多线程中使用ReentrantLock、synchronized加锁 简单举例
Java多线程中使用ReentrantLock.synchronized加锁 简单举例 public class Demo {final static Lock lock = new Reentran ...
- Java进阶:ReentrantLock和Condition基本使用
文章目录 1. 概述 2. 加锁解锁 3. Condition 3.1 await/signal 3.2 awaitNanos 1. 概述 Java除了使用synchronized锁之外,还可以使用R ...
- JDK1.8源码分析:可重入锁ReentrantLock和Condition的实现原理
synchronized的用法和实现原理 synchronized实现线程同步的用法和实现原理 不足 synchronized在线程同步的使用方面,优点是使用简单,可以自动加锁和解锁,但是也存在一些不 ...
最新文章
- Android平台开源项目
- python流程控制-实战案例手把手教你Python流程控制技巧
- The application may be doing too much work on its main thread.
- 如何关闭Struts2的webconsole.html
- 【HDU - 5917】Instability(规律,结论,Ramsey定理,知识点,tricks)
- Qt入门(11)——Qt插件
- springcloud断点续传源码_两套SpringCloud版的开源项目,项目源码和教程齐全
- java rt.jar的源代码的位置
- java 利用Scanner解析逗号字符串
- 什么是特洛伊木马病毒?
- 6、深思数盾加密狗使用小记
- No handler found for OPTIONS /lca/lcaplan/lcaplanprocess/list
- 基于FPGA的光纤数据传输
- 多张表格链接一起——《超级处理器》应用
- 事务四大特征:(原子性、一致性、隔离性、持久性)
- 晕LIVEnbsp;WRITER设置教程是网易…
- loadrunner12录制事件一直卡在11就不动了,大佬们,求助啊!!!
- 数据可视化——彩色通用设计之色彩搭配(制作对色盲人群友好的图形和演示)
- 调整autocad字体输入框大小
- 移远公司 NB-IoT模块AT指令详细解释
热门文章
- jsp+ssm计算机毕业设计超市库存管理系统【附源码】
- Presto客户端命令
- sidecar pattern
- 果粉看了别哭!回顾iPhone历代问题门,最后一个亮了
- html歌曲朋友圈,为何有的人喜欢在朋友圈里分享歌曲,他们都是些什么人?长见识了...
- 如何创建并保存网页ico图标
- elasticsearch整合springBoot
- recovery 强制执行恢复出厂设置(Rescue Party)
- wireshark解析TCP的几种状态 (SYN, FIN, ACK, PSH, RST, URG)
- QPCore Service 是什么?是否可以禁用?如何彻底删除它?