一、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. 深入理解HDFS分布式文件系统

    深入理解HDFS:Hadoop分布式文件系统: https://blog.csdn.net/bingduanlbd/article/details/51914550

  2. centos7下安装MySQL 5.7.26 二进制版本(免安装绿色版)

    MySQL 5.7.26 二进制版本安装(免安装绿色版) 下载地址 https://downloads.mysql.com/archives/community/ https://cdn.mysql. ...

  3. 中秋国庆8天挑战赛 之 挑战8天掌握微信小程序

    中秋国庆8天挑战赛 挑战8天掌握微信小程序 当前学习进度: // 10.1​// 学习内容:​// 10.2​// 学习内容:​// 10.3​// 学习内容:​// 10.4​// 学习内容:​// ...

  4. 【题解】CF1368C Even Picture

    \(\color{purple}{Link}\) \(\text{Solution:}\) 这是一道构造题. 题目要求恰好有\(n\)个点的四周全都是灰色点,所以直接输正方形是不行了. 考虑\(k=1 ...

  5. java高级项目 jdbc与数据库连接数据库

    //图书管类 public class Book { private Integer id; private String b_name; private double b_price; privat ...

  6. php-fpm 的各种启动方式

    启动 php-fpm 最简单的操作: /usr/local/php/sbin/php-fpm php 5.3.3 以后的php-fpm 不再支持 php-fpm 以前具有的 /usr/local/ph ...

  7. Python的逻辑控制true/false和循环

    逻辑判断 简单的几个尝试,看下和java的一点不同之处 1 > 2 # False 1 < 2 <3 # True 42 != '42' # True 'Name' == 'name ...

  8. linq 整理(前序)

    前言 对linq进行整理,分为前序.中序和后序. 前序就是一些简单的概念和模拟. 中序的话就是深挖一些思想. 后序对其进行解刨. 正文 语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# ...

  9. 发布MeteoInfo Java 1.2.1

    主要增加了合并netCDF文件的功能.在不同时间netCDF文件合并时考虑了不同文件起始时间不同的情况.

  10. mqtt网关

    MQTT网关 MQTT网关是可以是将普通的串口数据.Modbus RTU数据等转化为MQTT协议的从而方便与平台的对接,通过连接服务器.订阅和发布主题来实现传统设备和MQTT云端的联系.例如,笔记本和 ...