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并发包下的辅助工具类相关推荐

  1. Java实现Google的S2算法工具类

    WGS84坐标系 GCJ02坐标系 BD09坐标系的各种转换 WGS84坐标系 GCJ02坐标系 BD09坐标系的各种转换 Google S2 经纬度 转 CellId 经纬度 转 cellToken ...

  2. 存储过程排版工具_文案创作者必备的7个写作辅助工具类网站,记得收藏

    写作作为个人思想的表达渠道,从古至今一直就是一件被广为传承的事情,以前大家在纸上写写画画,修修改改的.自从有了电脑,大家写作的成本越来越低,随时都可以把自己所想传播出去,特别是进入了移动互联网时代,自 ...

  3. Java时间戳与日期格式转换工具类

    Java时间戳与日期格式转换工具类 在做web开发时,有时候需要用到时间戳,在前台进行日期转换,从数据库中取出来是日期格式的,这里记录下使用的转换工具类(这些都是静态方法,通过类名.方法的形式即可调用 ...

  4. (10)Java泛型-Map集合-集合框架工具类-可变参数-静态导入

    -- 部分1.5新特性Java泛型-Map集合-集合框架工具类 泛型 概述: JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制. 对于泛型可以这样理解: 没有使用泛型时,只要是对 ...

  5. 多线程十 JUC包下的常用工具类

    JUC包下的常用工具类 1. CountDownLatch-闭锁 2. CyclicBarrier-循环栅栏 3. Semaphore-信号量 4. Exchanger-线程数据交换器 这篇文章主要是 ...

  6. Java学习总结:58(Collections工具类)

    Collections工具类 Java提供了一个集合的工具类--Collections,这个工具类可以实现List.Set.Map集合的操作.Collections类的常用方法如下: No. 方法 类 ...

  7. Apache下的ArrayUtils工具类总结

    Apache下的ArrayUtils工具类总结 ArrayUtils中的方法: 1.add():将给定的数据添加到指定的数组中,返回一个新的数组. 2.addAll():合并两个数组. 3.conta ...

  8. java配置文件工具类,java项目加载配置文件的工具类

    java项目加载配置文件的工具类 package com.loadproperties; import java.io.IOException; import java.io.InputStream; ...

  9. Java 图片添加数字暗水印工具类

    Java 图片添加数字暗水印工具类. package cnki.thesis.common.utils;import org.opencv.core.*;import java.util.ArrayL ...

最新文章

  1. Python 骚操作:微信远程控制电脑
  2. 激光雷达:从光电技术角度看自动驾驶
  3. vue通信方法EventBus的实现
  4. Sonic 开源移动端云真机测试平台 - 设备中心接入安卓设备实例演示,Agent端服务部署过程详解
  5. Java多线程(一):Runnable和Thread的基本用法
  6. 可视化:中国地图 python/ geopandas/ echarts
  7. 深入理解nodejs的HTTP处理流程
  8. 7时过2小时是几时_飞机2小时和高铁7小时你愿意坐哪个?
  9. Mac上传代码到Github
  10. 假设系统中共有5个{P0,P1,P2,P3,P4}和A,B,C三类资源;A类资源共有10个,B类资源共有5个,C类资源共有7个。在时刻T0,系统资源分配情况如下表8-14所示。
  11. 数学建模入门-matlab实现偏微分方程数值解
  12. 使用IDEA反编译class文件
  13. FreeMarker生成word文档
  14. 最优化理论与凸优化的用处
  15. 新浪微博热门话题(30 分)(字符串)
  16. ios13 微信提示音插件_iOS13免越狱修改微信提示音教程 iPhoneXS-11修改微信提示音教程...
  17. 心跳包(HeartBeat)
  18. cote dlvoire_科特迪瓦-COTE D‘ IVOIRE-阿比让-ABIDJAN-港口介绍,港口介绍-环球运费网...
  19. 网红“骗粉”新套路:假装在底层
  20. 《你不可不知的人性》刘墉 读书笔记(二)

热门文章

  1. C#之五 StringBuilder 的使用
  2. 包你学会怎么在oracle中建立索引
  3. System.Runtime.InteropServices.COMException (0x80040154): 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CL
  4. java锁上升_Java内存模型FAQ(十一)新的内存模型是否修复了双重锁检查问题?...
  5. 深度残差网络(Deep Residual Network )
  6. elasticsearch启动成功,访问不成功问题
  7. 流程引擎问题系列1-No outgoing sequence flow of element
  8. Moodle 配置和使用系列——(一)Outgoing Email 配置
  9. javascript中bind函数理解
  10. python的super super easy教程 | 垃圾回收 引用计数 深拷贝和浅拷贝