Java并发包下的辅助工具类
Java并发包下为我们提供了一些辅助工具类,来简单看看如何使用
一、CountDownLatch
减法器,必须等到减法器的值为0了,才能继续往下执行。也可以将它理解为栅栏
让一些线程堵塞直到另一个线程完成一系列操作后才被唤醒。CountDownLatch 主要有两个方法,当一个或多个线程调用 await 方法时,调用线程会被堵塞,其他线程调用 countDown 方法会将计数减一(调用 countDown 方法的线程不会堵塞),当计数其值变为零时,因调用 await 方法被堵塞的线程会被唤醒,继续执行。
来看两个小案例,模拟六个学生全部走出教室门之后才关门
public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException {CountDownLatch countDownLatch=new CountDownLatch(6);for(int i=1;i<=6;i++){new Thread(()->{System.out.println(Thread.currentThread().getName()+"Go out");countDownLatch.countDown(); //数量减一},String.valueOf(i)).start();}countDownLatch.await();System.out.println("Close Door");}
}
再来看看一个刘关张三结义的案例
/*** Author: 徐志* Date: 2020/8/8 16:44*/
public class CountDownLatchDemo2 {public static void main(String[] args) {CountDownLatch countDownLatch=new CountDownLatch(2);new Thread(()->{System.out.println("刘备--》在等待");try {countDownLatch.await();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("刘关张桃园三结义");}).start();new Thread(()->{System.out.println("张飞--》骑马而来");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("张飞拜见大哥");countDownLatch.countDown();}).start();new Thread(()->{System.out.println("关羽--》骑马而来");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("关羽拜见大哥");countDownLatch.countDown();}).start();}
}
必须三位壮士到齐了,才能三结义。
有时候在程序里,我们需要保证,让某一部分代码执行完成后,主线程才继续往下执行,就可以使用CountDownLatch
二、CyclicBarrier
这是一个加法器,和CountDownLatch正好相反,必须数量达到我们设定的值之后,才会执行相应的代码
每调用一次await()方法,计数器加1
public class CyclicBarrierDemo {public static void main(String[] args) throws BrokenBarrierException, InterruptedException {CyclicBarrier cyclicBarrier=new CyclicBarrier(8,()->{System.out.println("召唤神龙成功");});for (int i = 1; i <=7 ; i++) {final int temp=i;new Thread(()->{System.out.println(Thread.currentThread().getName()+"收集"+temp+"个龙珠");try {cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}}).start();}cyclicBarrier.await();System.out.println("悟空和他的小伙伴过上了幸福的生活");}
}
三、信号量
信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。
举例说明就是抢车位,车位只有3个,而车有六个,必须等停在车位上的车走了,等待的车才能进入
public class SemaphoreTest {public static void main(String[] args) {Semaphore semaphore=new Semaphore(3); //限流for(int i=1;i<=6;i++){new Thread(()->{try {semaphore.acquire();System.out.println(Thread.currentThread().getName()+"抢到车位");TimeUnit.SECONDS.sleep(2);System.out.println(Thread.currentThread().getName()+"离开车位");} catch (InterruptedException e) {e.printStackTrace();}finally {semaphore.release();}}).start();}}
}
Java并发包下的辅助工具类相关推荐
- Java实现Google的S2算法工具类
WGS84坐标系 GCJ02坐标系 BD09坐标系的各种转换 WGS84坐标系 GCJ02坐标系 BD09坐标系的各种转换 Google S2 经纬度 转 CellId 经纬度 转 cellToken ...
- 存储过程排版工具_文案创作者必备的7个写作辅助工具类网站,记得收藏
写作作为个人思想的表达渠道,从古至今一直就是一件被广为传承的事情,以前大家在纸上写写画画,修修改改的.自从有了电脑,大家写作的成本越来越低,随时都可以把自己所想传播出去,特别是进入了移动互联网时代,自 ...
- Java时间戳与日期格式转换工具类
Java时间戳与日期格式转换工具类 在做web开发时,有时候需要用到时间戳,在前台进行日期转换,从数据库中取出来是日期格式的,这里记录下使用的转换工具类(这些都是静态方法,通过类名.方法的形式即可调用 ...
- (10)Java泛型-Map集合-集合框架工具类-可变参数-静态导入
-- 部分1.5新特性Java泛型-Map集合-集合框架工具类 泛型 概述: JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制. 对于泛型可以这样理解: 没有使用泛型时,只要是对 ...
- 多线程十 JUC包下的常用工具类
JUC包下的常用工具类 1. CountDownLatch-闭锁 2. CyclicBarrier-循环栅栏 3. Semaphore-信号量 4. Exchanger-线程数据交换器 这篇文章主要是 ...
- Java学习总结:58(Collections工具类)
Collections工具类 Java提供了一个集合的工具类--Collections,这个工具类可以实现List.Set.Map集合的操作.Collections类的常用方法如下: No. 方法 类 ...
- Apache下的ArrayUtils工具类总结
Apache下的ArrayUtils工具类总结 ArrayUtils中的方法: 1.add():将给定的数据添加到指定的数组中,返回一个新的数组. 2.addAll():合并两个数组. 3.conta ...
- java配置文件工具类,java项目加载配置文件的工具类
java项目加载配置文件的工具类 package com.loadproperties; import java.io.IOException; import java.io.InputStream; ...
- Java 图片添加数字暗水印工具类
Java 图片添加数字暗水印工具类. package cnki.thesis.common.utils;import org.opencv.core.*;import java.util.ArrayL ...
最新文章
- Python 骚操作:微信远程控制电脑
- 激光雷达:从光电技术角度看自动驾驶
- vue通信方法EventBus的实现
- Sonic 开源移动端云真机测试平台 - 设备中心接入安卓设备实例演示,Agent端服务部署过程详解
- Java多线程(一):Runnable和Thread的基本用法
- 可视化:中国地图 python/ geopandas/ echarts
- 深入理解nodejs的HTTP处理流程
- 7时过2小时是几时_飞机2小时和高铁7小时你愿意坐哪个?
- Mac上传代码到Github
- 假设系统中共有5个{P0,P1,P2,P3,P4}和A,B,C三类资源;A类资源共有10个,B类资源共有5个,C类资源共有7个。在时刻T0,系统资源分配情况如下表8-14所示。
- 数学建模入门-matlab实现偏微分方程数值解
- 使用IDEA反编译class文件
- FreeMarker生成word文档
- 最优化理论与凸优化的用处
- 新浪微博热门话题(30 分)(字符串)
- ios13 微信提示音插件_iOS13免越狱修改微信提示音教程 iPhoneXS-11修改微信提示音教程...
- 心跳包(HeartBeat)
- cote dlvoire_科特迪瓦-COTE D‘ IVOIRE-阿比让-ABIDJAN-港口介绍,港口介绍-环球运费网...
- 网红“骗粉”新套路:假装在底层
- 《你不可不知的人性》刘墉 读书笔记(二)
热门文章
- C#之五 StringBuilder 的使用
- 包你学会怎么在oracle中建立索引
- System.Runtime.InteropServices.COMException (0x80040154): 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CL
- java锁上升_Java内存模型FAQ(十一)新的内存模型是否修复了双重锁检查问题?...
- 深度残差网络(Deep Residual Network )
- elasticsearch启动成功,访问不成功问题
- 流程引擎问题系列1-No outgoing sequence flow of element
- Moodle 配置和使用系列——(一)Outgoing Email 配置
- javascript中bind函数理解
- python的super super easy教程 | 垃圾回收 引用计数 深拷贝和浅拷贝