一、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. Spring学习(十)Spring知识点汇总

    一.基础概念 Q:Spring是什么? 定义:Spring是一个轻量级的IoC(控制反转)和AOP容器框架. 目的:用于简化企业应用程序的开发,使得开发者只需要关心业务需求. 常见的配置方式: 基于X ...

  2. 使用jpa时,实体类有不存在数据库中的字段

    使用jpa时,实体类有不存在数据库中的字段.在改属性上面加上这个注解@Transient就可以解决问题.

  3. Spring Boot 第三弹,一文带你了解日志如何配置?

    前言 日志通常不会在需求阶段作为一个功能单独提出来,也不会在产品方案中看到它的细节.但是,这丝毫不影响它在任何一个系统中的重要的地位. 今天就来介绍一下Spring Boot中的日志如何配置. Spr ...

  4. c#后台代码请求访问api接口

    前言:最近公司项目与外部api接口对接较多 ,写下自己的代码总结.介绍两种访问方式(HttpClient.HttpWebRequest) 一.HttpWebRequest 访问Api private ...

  5. 设计模式PDF下载了4.0万本!那,再肝一本《Java面经手册》吧!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 1. 先祝贺下自己拿下4.0万本下载量! <重学Java设计模式>PDF ...

  6. 《Java从入门到失业》第五章:继承与多态(5.1-5.7):继承

    5.继承与多态 5.1为什么要继承 最近我儿子迷上了一款吃鸡游戏<香肠派对>,无奈给他买了许多玩具枪,我数了下,有一把狙击枪AWM,一把步枪AK47,一把重机枪加特林(Gatling).假 ...

  7. matlab中find 查找非零元素的索引和值

    来源:https://ww2.mathworks.cn/help/matlab/ref/find.html?searchHighlight=find&s_tid=doc_srchtitle f ...

  8. Arduino 串口库函数

    库函数目录 if (Serial) available() availableForWrite() begin() end() find() findUntil() flush() parseFloa ...

  9. 50个你必须了解的Kubernetes面试问题

    Kubernetes一直是当今业界的流行语,也是最好的编排工具.它吸引了许多想要提升自己职业生涯的经验丰富的专业人士.HuaWei,Pokemon,Box,eBay,Ing,Yahoo Japan,S ...

  10. ASP。NET MVC警告横幅使用Bootstrap和AngularUI Bootstrap

    Watch this script in action - demo 下载Source Code from GitHub 下载Source Code from CodeProject (1.1 MB) ...