一、java.util.concurrent.CountDownLatch------减少计数

  1.执行原理:

    ①。CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞。

    ②。其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),

    ③。当计数器的值变为0时,因await方法阻塞的线程会被唤醒,继续执行。

  2.核心方法

    

  3.代码实现 

 1 package com.jenne.mydemo;
2
3 import java.util.concurrent.CountDownLatch;
4
5 public class TestCountDownLatch {
6 public static void main(String[] args) throws InterruptedException {
7
8 //构造一个CountDownLatch,给定计数初始化为6
9 CountDownLatch cd = new CountDownLatch(6);
10
11 for (int i = 1; i <= 6; i++) {
12 new Thread(() -> {
13 System.out.println(Thread.currentThread().getName() + "------>线程被灭");
14 cd.countDown();//计数器--
15 }).start();
16 }
17
18 cd.await();//在这里阻塞线程,当计数器变为0时才放行
19 System.out.println(Thread.currentThread().getName() + "------>我是最终执行的");
20
21 }
22
23 }

二、java.util.concurrent.CyclicBarrier------循环栅栏

  1.执行原理

    ①、让一组线程到达一个屏障(也可以叫同步点)时被阻塞,

    ②、直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。

    ③、线程进入屏障通过CyclicBarrier的await()方法。

  2.核心方法

    

  3.代码实现

 1 package com.jenne.mydemo;
2
3 import java.util.concurrent.BrokenBarrierException;
4 import java.util.concurrent.CyclicBarrier;
5
6 public class TestCyclicBarrier {
7 public static void main(String[] args) {
8 CyclicBarrier cyclicBarrier = new CyclicBarrier(
9     7, //一组线程(7个线程组成)
10 new Runnable() { //一组线程全到达后才执行的线程
11 @Override
12 public void run() {
13 System.out.println("集齐7颗龙珠召唤神龙");
14 }
15 });
16 for (int i = 1; i <= 7; i++) {
17 new Thread(new Runnable() {
18 @Override
19 public void run() {
20 try {
21 System.out.println(Thread.currentThread().getName() + "\t 星龙珠被收集");
22
23 cyclicBarrier.await();//某个线程到达屏障,阻塞
24
25 } catch (InterruptedException | BrokenBarrierException e) {
26 e.printStackTrace();
27 }
28 }
29 }, String.valueOf(i)).start();
30 }
31 }
32 }

三、java.util.concurrent.Semaphore------信号灯

  1.执行原理

    acquire(获取):当一个线程调用acquire操作时,它要么通过成功获取信号量(信号量减1),要么一直等下去,直到有线程释放信号量,或超时。

    release(释放):实际上会将信号量的值加1,然后唤醒等待的线程。

    信号量主要用于两个目的,一个是用于多个共享资源的互斥使用,另一个用于并发线程数的控制。

  2.核心代码

    

  3.代码实现

 1 package com.jenne.mydemo;
2
3 import java.util.concurrent.Semaphore;
4 import java.util.concurrent.TimeUnit;
5
6 public class TestSemaphore {
7 public static void main(String[] args) {
8
9 //创建一个Semaphore实例并初始化3个不公平同步锁
10 Semaphore sp = new Semaphore(3);
11
12 //开启六个线程
13 for (int i = 1; i <= 6; i++) {
14 new Thread(() -> {
15 try {
16 sp.acquire(); //获取一个信号量(信号量--)
17 System.out.println(Thread.currentThread().getName() + "\t号车驶入停车位");
18 TimeUnit.SECONDS.sleep(3);//睡3秒
19 System.out.println(Thread.currentThread().getName() + "\t号车驶出停车位");
20 } catch (InterruptedException e) {
21 e.printStackTrace();
22 } finally {
23 sp.release();//释放一个信号量(信号量++)
24 }
25 }, String.valueOf(i)).start();
26 }
27
28 }
29 }

JUC---02JUC辅助类的更多相关文章

  1. JUC学习笔记(六)

    JUC学习笔记(一)https://www.cnblogs.com/lm66/p/15118407.html JUC学习笔记(二)https://www.cnblogs.com/lm66/p/1511 ...

  2. 多线程JUC并发篇常见面试详解

    @ 目录 1.JUC 简介 2.线程和进程 3.并非与并行 4.线程的状态 5.wait/sleep的区别 6.Lock 锁(重点) 1.Lock锁 2.公平非公平: 3.ReentrantLock ...

  3. JUC之Callable接口回顾和JUC辅助类

    Callable接口和JUC辅助类 Callable接口: 回顾: 创建线程的四种方式: 继承Thread 实现runnable接口 实现callable接口 使用线程池 之前的文章:多线程编程1-定 ...

  4. JUC(4)Callable和常用的辅助类

    1.Callable 1.可以有返回值 2.可以抛出异常 3.方法不同.run()/call() future Task 细节: 1.有缓存 2.结果可能需要等待,会阻塞 2.常用的辅助类 2.1 C ...

  5. JUC强大的辅助类讲解--->>>CountDownLatchDemo (减少计数)

    原理: CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞.其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞), ...

  6. JUC 并发编程--04 常用的辅助类CountDownLatch , CyclicBarrier , Semaphore , 读写锁 , 阻塞队列,CompletableFuture(异步回调)

    CountDownLatch 相当于一个减法计数器, 构造方法指定一个数字,比如6, 一个线程执行一次,这个数字减1, 当变为0 的时候, await()方法,才开始往下执行,, 看这个例子 Cycl ...

  7. Java多线程系列--“JUC锁”10之 CyclicBarrier原理和示例

    概要 本章介绍JUC包中的CyclicBarrier锁.内容包括:CyclicBarrier简介CyclicBarrier数据结构CyclicBarrier源码分析(基于JDK1.7.0_40)Cyc ...

  8. Java多线程系列--“JUC锁”01之 框架

    本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--“JUC锁”01之 框架02. Java多线程系列--“JUC锁”02之 互斥锁Reentrant ...

  9. 【JUC】JUC锁框架综述

    一.前言 在分析完了集合框架后,很有必要接着分析java并发包下面的源码,JUC(java.util.concurrent)源码也是我们学习Java迈进一步的重要过程.我们分为几个模块进行分析,首先是 ...

  10. java多线程系类:JUC锁:01之框架

    本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--"JUC锁"01之 框架02. Java多线程系列--"JUC锁&q ...

随机推荐

  1. linux学习(三)Linux 系统目录结构

    一.查看目录 登录系统后,在当前命令窗口下输入命令: ls / 树状目录结构: 二.目录解析 /bin: 存放二进制可执行文件(ls,cat,mkdir等). /boot: 存放启动Linux时使用的 ...

  2. 记一次springboot(2.1.6)+springcloud(Greenwich.SR2) 配置中心搭建,支持在线刷新

    1.配置eureka注册中心 EureKaSpringApplication: package com.crow.eureka; import org.springframework.boot.Spr ...

  3. spring cloud微服务快速教程之(十四)spring cloud feign使用okhttp3--以及feign调用参数丢失的说明

    0-前言 spring cloud feign 默认使用httpclient,需要okhttp3的可以进行切换 当然,其实两者性能目前差别不大,差别较大的是很早之前的版本,所以,喜欢哪个自己选择: 1 ...

  4. 学习篇:NodeJS中的模板引擎:jade

    NodeJS 模板引擎作用:生成页面 在node常用的模板引擎一般是 1.jade --破坏式的.侵入式.强依赖(对原有的html体系不友好,走自己的一套体系)2.ejs --温和的.非侵入式的.弱依 ...

  5. 电商订单ElasticSearch同步解决方案--使用logstash

    一.使用logstash同步订单数据(订单表和订单项表)到ElasticSearch: 1.到官网下载logstash:https://www.elastic.co/cn/downloads/logs ...

  6. 关于VS编译报错,但是错误信息未提示问题解决方案

    可能代码中引用了别的类库中的函数,然后未编译被引用库导致编译报错,重新编译被引用库然后再编译当前库即可解决问题

  7. 使用Commons FileUpload 1.3.3和Servlet 3.0上传文件

    简介 Commons FileUpload可以轻松地为web应用程序添加强大,高性能的文件上传功能.Servlet3.0之前的web应用程序需要使用Commons FileUpload组件上传文件,但 ...

  8. 嵌入式arm-linux mips-linux 交叉编译GDB,结合vscode图形化调试使用,coredump定位段错误

    第一部分:使用GDB GDB源码下载路径:http://ftp.gnu.org/gnu/gdb/ 遇到的主要难点: 选择合适的GDB源码版本 我的mips-linux交叉编译器不支持C++11特性,所 ...

  9. Win7 64X 安装VisualSVNServer 2.6.0过程中出现Custom action InstallWMISchemaExcute failed: Cannot query proxy blanket: No such interface supported (0x80004002)

    Win7 64X 安装VisualSVNServer 2.6.0过程中出现错误:Custom action InstallWMISchemaExcute failed: Cannot query pr ...

  10. 8-kubernetes-安全

    kubernetes安全框架 访问K8S集群的资源需要过三关:认证.鉴权.准入控制,任意一个不通过都会失败 普通用户若要安全访问集群API server,往往需要证书.token或者用户名+密码,po ...