JUC---02JUC辅助类
一、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辅助类的更多相关文章
- JUC学习笔记(六)
JUC学习笔记(一)https://www.cnblogs.com/lm66/p/15118407.html JUC学习笔记(二)https://www.cnblogs.com/lm66/p/1511 ...
- 多线程JUC并发篇常见面试详解
@ 目录 1.JUC 简介 2.线程和进程 3.并非与并行 4.线程的状态 5.wait/sleep的区别 6.Lock 锁(重点) 1.Lock锁 2.公平非公平: 3.ReentrantLock ...
- JUC之Callable接口回顾和JUC辅助类
Callable接口和JUC辅助类 Callable接口: 回顾: 创建线程的四种方式: 继承Thread 实现runnable接口 实现callable接口 使用线程池 之前的文章:多线程编程1-定 ...
- JUC(4)Callable和常用的辅助类
1.Callable 1.可以有返回值 2.可以抛出异常 3.方法不同.run()/call() future Task 细节: 1.有缓存 2.结果可能需要等待,会阻塞 2.常用的辅助类 2.1 C ...
- JUC强大的辅助类讲解--->>>CountDownLatchDemo (减少计数)
原理: CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞.其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞), ...
- JUC 并发编程--04 常用的辅助类CountDownLatch , CyclicBarrier , Semaphore , 读写锁 , 阻塞队列,CompletableFuture(异步回调)
CountDownLatch 相当于一个减法计数器, 构造方法指定一个数字,比如6, 一个线程执行一次,这个数字减1, 当变为0 的时候, await()方法,才开始往下执行,, 看这个例子 Cycl ...
- Java多线程系列--“JUC锁”10之 CyclicBarrier原理和示例
概要 本章介绍JUC包中的CyclicBarrier锁.内容包括:CyclicBarrier简介CyclicBarrier数据结构CyclicBarrier源码分析(基于JDK1.7.0_40)Cyc ...
- Java多线程系列--“JUC锁”01之 框架
本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--“JUC锁”01之 框架02. Java多线程系列--“JUC锁”02之 互斥锁Reentrant ...
- 【JUC】JUC锁框架综述
一.前言 在分析完了集合框架后,很有必要接着分析java并发包下面的源码,JUC(java.util.concurrent)源码也是我们学习Java迈进一步的重要过程.我们分为几个模块进行分析,首先是 ...
- java多线程系类:JUC锁:01之框架
本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--"JUC锁"01之 框架02. Java多线程系列--"JUC锁&q ...
随机推荐
- svn提交代码出错
今天提交代码的时候一直报错,下面是错误信息 Error: Commit failed (details follow): Error: Commit blocked by pre-commit ho ...
- PHP代码审计学习(1)
全局变量与超全局变量 $GLOBALS $GLOBALS 是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问,$GLOBALS 是一个包含了全部变量的全局组合数组.变量的名字就是数 ...
- 极简 Node.js 入门 - 4.3 可读流
极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...
- # 初体验之腾讯位置服务彩云天气开发者api
初体验 最近接触到了boxjs,看到了里面一个比较有意思的彩云天气的脚本,由于自己本身就是彩云天气pro的用户,日常使用过程中感觉到彩云的降雨提醒还是挺方便的,于是就准备开始使用这个天气的脚本. 脚本 ...
- osgEarth使用笔记4——加载矢量数据
目录 1. 概述 2. 详论 2.1. 基本绘制 2.2. 矢量符号化 2.2.1. 可见性 2.2.2. 高度设置 2.2.3. 符号化 2.2.4. 显示标注 2.3. 其他 3. 结果 4. 问 ...
- Java学习day03
day03 课堂笔记 1.数据类型 2.总结第二章到目前为止所学内容: * 标识符 * 关键字 * 字面值 * 变量 成员变量如果没有赋值,系统会自动赋值,而局部变量不手动赋值,则会编译不通过. * ...
- python基础知识 变量 数据类型 if判断
cpu 内存 硬盘 操作系统 cpu:计算机的运算和计算中心,相当于人类的大脑 飞机 内存:暂时存储一些数据,临时加载数据和应用程序 4G 8G 16G 32G 速度快,高铁 断电即消失 造价高 硬盘 ...
- 日志分析平台ELK之日志收集器logstash常用插件配置
前文我们了解了logstash的工作流程以及基本的收集日志相关配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13761906.html:今天我们来了解下l ...
- Matlab中num2str函数的用法
转载:https://blog.csdn.net/SMF0504/article/details/51836062 函数功能: 把数值转换成字符串, 转换后可以使用fprintf或disp函数进行输出 ...
- 二进制部署Redis-5.07
Redis简介 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理. 它支持字符串.哈希表.列表.集合.有序集合,位图,hyperloglogs等数据类 ...