CountDownLatch/CyclicBarrier/Semaphore 使用过吗
CountDownLatch
让一些线程堵塞直到另一个线程完成一系列操作后才被唤醒。CountDownLatch 主要有两个方法,当一个或多个线程调用 await 方法时,调用线程会被堵塞,其他线程调用 countDown 方法会将计数减一(调用 countDown 方法的线程不会堵塞),当计数其值变为零时,因调用 await 方法被堵塞的线程会被唤醒,继续执行。
假设我们有这么一个场景,教室里有班长和其他6个人在教室上自习,怎么保证班长等其他6个人都走出教室在把教室门给关掉。
public class CountDownLanchDemo {
public static void main(String[] args) {
for (int i = 0; i < 6; i++) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " 离开了教室...");
}, String.valueOf(i)).start();
}
System.out.println("班长把门给关了,离开了教室...");
}
}
0 离开了教室...
1 离开了教室...
2 离开了教室...
3 离开了教室...
班长把门给关了,离开了教室...
5 离开了教室...
4 离开了教室...
发现班长都没有等其他人理他教室就把门给关了,此时我们就可以使用 CountDownLatch 来控制
public class CountDownLanchDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(6);
for (int i = 0; i < 6; i++) {
new Thread(() -> {
countDownLatch.countDown();
System.out.println(Thread.currentThread().getName() + " 离开了教室...");
}, String.valueOf(i)).start();
}
countDownLatch.await();
System.out.println("班长把门给关了,离开了教室...");
}
}
0 离开了教室...
1 离开了教室...
2 离开了教室...
3 离开了教室...
4 离开了教室...
5 离开了教室...
班长把门给关了,离开了教室...
使用枚举完成countDownLatch案例
@Setter
@Getter
public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch=new CountDownLatch(6) ; for (int i = 1; i <=6; i++) {
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"国被灭.......");
countDownLatch.countDown();
},CountryEnum.getcountryEnum(i).getName()+"").start();
} countDownLatch.await(); System.out.println(CountryEnum.seven+"国一统华夏");
}
} @Getter
enum CountryEnum {
one(1, "齐", "100", "demaxiya1"),
two(2, "楚", "100", "demaxiya1"),
three(3, "燕", "100", "demaxiya1"),
four(4, "韩", "100", "demaxiya1"),
five(5, "赵", "100", "demaxiya1"),
six(6, "巍", "100", "demaxiya1"),
seven(7, "秦", "100", "demaxiya1");
private Integer id; private String name;
private String time;
private String beizhu; CountryEnum(Integer id, String name, String time, String beizhu) {
this.id = id;
this.name = name;
this.time = time;
this.beizhu = beizhu;
}
public static CountryEnum getcountryEnum(Integer id ){
for (CountryEnum value : values()) {
if (value.id==id){
return value;
}
}
return null;
}
}
打印
齐国被灭.......
燕国被灭.......
楚国被灭.......
韩国被灭.......
巍国被灭.......
赵国被灭.......
seven国一统华夏
、CyclicBarrier(集齐七颗龙珠召唤神龙)
CycliBarrier
可循环(Cyclic)使用的屏障。让一组线程到达一个屏障(也可叫同步点)时被阻塞,知道最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活,线程进入屏障通过CycliBarrier的await()方法
代码示例:
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier; public class CyclicBarrierDemo {
public static void main(String[] args) {
cyclicBarrierTest();
} public static void cyclicBarrierTest() {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {
System.out.println("====召唤神龙=====");
});
for (int i = 1; i <= 7; i++) {
final int tempInt = i;
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "\t收集到第" + tempInt + "颗龙珠");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}, "" + i).start();
}
}
}
打印2 收集到第2颗龙珠
3 收集到第3颗龙珠
1 收集到第1颗龙珠
5 收集到第5颗龙珠
4 收集到第4颗龙珠
6 收集到第6颗龙珠
7 收集到第7颗龙珠
====召唤神龙=====3、Semaphore信号量
可以代替Synchronize和Lock
信号量主要用于两个目的,一个是用于多个共享资源的互斥作用,另一个用于并发线程数的控制
代码示例:
抢车位示例:
package juc.lock.SemaphoreDemo; import java.util.concurrent.Semaphore; /**
* @Classname SemaphoreDemo
* @Description TODO
* @Date 2020/7/13 23:03
* @Created by imp
*/
public class SemaphoreDemo { public static void main(String[] args) {
Semaphore semaphore=new Semaphore(3); //3个车位 for (int i = 0; i < 6; i++) {
new Thread(()->{
try {
//抢占车位
semaphore.acquire();
System.out.println(Thread.currentThread().getName()+"\t抢占到车位");
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName()+"\t停两秒钟离开");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
semaphore.release();
}
},String.valueOf(i)).start();
}
}
}
打印:0 抢占到车位
1 抢占到车位
4 抢占到车位
0 停两秒钟离开
5 抢占到车位
1 停两秒钟离开
4 停两秒钟离开
2 抢占到车位
3 抢占到车位
5 停两秒钟离开
3 停两秒钟离开
2 停两秒钟离开
CountDownLatch/CyclicBarrier/Semaphore 使用过吗的更多相关文章
- 并发包下常见的同步工具类详解(CountDownLatch,CyclicBarrier,Semaphore)
目录 1. 前言 2. 闭锁CountDownLatch 2.1 CountDownLatch功能简介 2.2 使用CountDownLatch 2.3 CountDownLatch原理浅析 3.循环 ...
- CountDownLatch/CyclicBarrier/Semaphore 使用过吗?
CountDownLatch/CyclicBarrier/Semaphore 使用过吗?下面详细介绍用法: 一,(等待多线程完成的)CountDownLatch 背景; countDownLatch ...
- Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo
Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo CountDownLatch countDownLatch这个类使一个线程等待其他线程 ...
- 并发包下常见的同步工具类(CountDownLatch,CyclicBarrier,Semaphore)
在实际开发中,碰上CPU密集且执行时间非常耗时的任务,通常我们会选择将该任务进行分割,以多线程方式同时执行若干个子任务,等这些子任务都执行完后再将所得的结果进行合并.这正是著名的map-reduce思 ...
- Java中的4个并发工具类 CountDownLatch CyclicBarrier Semaphore Exchanger
在 java.util.concurrent 包中提供了 4 个有用的并发工具类 CountDownLatch 允许一个或多个线程等待其他线程完成操作,课题点 Thread 类的 join() 方法 ...
- 高并发第十单:J.U.C AQS(AbstractQueuedSynchronizer) 组件:CountDownLatch. CyclicBarrier .Semaphore
这里有一篇介绍AQS的文章 非常好: Java并发之AQS详解 AQS全名:AbstractQueuedSynchronizer,是并发容器J.U.C(java.lang.concurrent)下lo ...
- CountDownLatch CyclicBarrier Semaphore 比较
document CountDownLatch A synchronization aid that allows one or more threads to wait until a set of ...
- 多线程中 CountDownLatch CyclicBarrier Semaphore的使用
CountDownLatch 调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行.也可以传入时间,表示时间到之后,count还没有为0的时候,就会继续执行. package ...
- 等待某(N)个线程执行完再执行某个线程的几种方法(Thread.join(),CountDownLatch,CyclicBarrier,Semaphore)
1.main线程中先调用threadA.join() ,再调用threadB.join()实现A->B->main线程的执行顺序 调用threadA.join()时,main线程会挂起,等 ...
- 并发工具类的使用 CountDownLatch,CyclicBarrier,Semaphore,Exchanger
1.CountDownLatch 允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助. A CountDownLatch用给定的计数初始化. await方法阻塞,直到由于countDo ...
随机推荐
- C# operator 关键字的用法
operator 只要是运算符都能重载 operator 关键字的主要作用是用来重载运算符的,还可以用于类或结构中类型的自定义转换. 下面看个例子 class Feige { //定义两个全局变量 i ...
- LZZ磁力资源搜索4.2.2,整合多个站点,大部分资源都能搜到
资源搜索 4.2.2.20200310网友提出的功能已完成1:新增 时间日期排序,单击表头或右键菜单选择,即可自动排序2:新增 搜索完毕 音效开启或关闭 选项3:资源站点 Sunyaa 由聚合站点改为 ...
- LeetCode初级算法之字符串:7 整数反转
整数反转 题目地址:https://leetcode-cn.com/problems/reverse-integer/ 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 ...
- LeetCode初级算法之数组:122 买卖股票的最佳时机 II
买卖股票的最佳时机 II 题目地址:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/ 给定一个数组,它的第 i ...
- Day1 Scrum 冲刺博客
团队作业4--项目冲刺 第一篇博客 一. 各个成员在 Alpha 阶段认领的任务 蔡越,冷沐样:视觉元素设计与方块类Cell开发 周梓波,纪昂学:游戏功能逻辑开发,即抽象出主要元素对应的数据类型 廖业 ...
- Alpha冲刺阶段Day4
[Alpha冲刺阶段]Scrum Meeting Daily4 1.会议简述 会议开展时间 2020/5/25 7:30-7:50 PM 会议基本内容摘要 讨论了各自任务完成情况以及明日计划 参与 ...
- filereader 和 window.URL.createObjectURL
<template> <div class="file-preview"> <h4>前端图片预览之 filereader 和 window.UR ...
- C# 继承类的值赋
C# 继承类的值赋 /// <summary> /// 将父类的值赋值到子类中 /// </summary> /// <typeparam name="TPar ...
- HashMap相关类:Hashtable、LinkHashMap、TreeMap
前言 很高兴遇见你~ 在 深入剖析HashMap 文章中我从散列表的角度解析了HashMap,在 深入解析ConcurrentHashMap:感受并发编程智慧 解析了ConcurrentHashMap ...
- 图的遍历DFS
图的遍历DFS 与树的深度优先遍历之间的联系 树的深度优先遍历分为:先根,后根 //树的先根遍历 void PreOrder(TreeNode *R){ if(R!=NULL){ visit(R); ...