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 ...
随机推荐
- 消息队列MQ面试专题(rabbitmq)
正文: 1.什么是 rabbitmq 采用 AMQP 高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦 2.为什么要使用 rabbitmq 在分布 ...
- Shiro入门学习---使用自定义Realm完成认证|练气中期
写在前面 在上一篇文章<shiro认证流程源码分析--练气初期>当中,我们简单分析了一下shiro的认证流程.不难发现,如果我们需要使用其他数据源的信息完成认证操作,我们需要自定义Real ...
- Matlab中的uigetfile用法
参考:https://ww2.mathworks.cn/help/matlab/ref/uigetfile.html?searchHighlight=uigetfile&s_tid=doc_s ...
- Arduino PID Library
Arduino PID Library by Brett Beauregard,contact: br3ttb@gmail.com What Is PID? PID是什么 From Wikipe ...
- 【题解】Bzoj3916
字符串\(Hash\). 笔者实在太菜了,到现在还没有熟练掌握\(Hash\),就来这里写一篇学习笔记. \(Description\) 有三个好朋友喜欢在一起玩游戏,\(A\)君写下一个字符串\(S ...
- IntelliJ IDEA 调试 Java 8 Stream,实在太香了!
前段时间,栈长发布了一篇关于 Java 8 Optional.map 的实用文章,留言区就有的人说 Java 8 的语法糖不方便调试,还要视情况使用. 留言区也有人说 IntelliJ IDEA 早已 ...
- JSOI 2008 【魔兽地图】
其实这题是我从noip前就开始做的...那个时候打的Pascal,一直TLE,转了C++之后我又写了一遍,A了... 辛酸史: 题目描述: DotR (Def ...
- Elasticsearch(3):别名
ES中可以为索引添加别名,一个别名可以指向到多个索引中,同时在添加别名时可以设置筛选条件,指向一个索引的部分数据,实现在关系数据库汇总的视图功能,这就是ES中别名的强大之处.别名是一个非常实用的功 ...
- object-fit 详解
contain 被替换的内容将被缩放,以在填充元素的内容框时保持其宽高比. 整个对象在填充盒子的同时保留其长宽比,因此如果宽高比与框的宽高比不匹配,该对象将被添加"黑边". cov ...
- str常用操作方法
1. 索引(即下标) s = 'ABCDEFGHIJKLMN' s1 = s[0] print('s[0] = ' + s1) #s[0] = A print('s[3] = '+ s[3]) #s[ ...