Java_JUC_CountDownLatch/CyclicBarrier循环屏障/Semaphore信号灯/枚举
Java_JUC_CountDownLatch/CyclicBarrier循环屏障/Semaphore信号灯/枚举
java常用的juc api
(一)枚举
1.1 代码实现
package jucapi;import lombok.Getter;/*** 枚举 就是一张数据库的表* 用了枚举可以降低程序的耦合度** 主要是给CountDownLatchDemo用的*/public enum CountryEnum{ONE(1,"齐"), TWO(2,"楚"), THREE(3,"燕"), FOUR(4,"赵"), FIVE(5,"魏"), SIX(6,"韩");@Getter private Integer retCode; //1@Getter private String retMessage; //齐@Getter private String retMessage2;CountryEnum(Integer retCode, String retMessage) {this.retCode = retCode;this.retMessage = retMessage;}/*** CountDownLatchDemo 调用的方法* @param index 1* @return 齐*/public static CountryEnum forEach_CountryEnum(int index){//变数组CountryEnum[] myArray = CountryEnum.values();//增强for循环//如果CountDownLatchDemo传过来的index是1,那么我返回“齐”for(CountryEnum element:myArray){if(index == element.getRetCode()){return element;}}return null;}/*** get set* @return*/public Integer getRetCode() {return retCode;}public void setRetCode(Integer retCode) {this.retCode = retCode;}public String getRetMessage() {return retMessage;}public void setRetMessage(String retMessage) {this.retMessage = retMessage;}}/**mysql daNmae = CountryEnumtableoneID userName age birth userEmail1 齐 109ONE(1,"齐",v2,v3,v4,v5)*/
(二)CountDownLatch
2.1 什么是CountDownLatch?
让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒。
2.2 方法
- //大招step1
CountDownLatch countDownLatch = new CountDownLatch(6); - //大招step2
countDownLatch.countDown(); - //大招step3
countDownLatch.await();
一个或多个调用await方法的线程会被阻塞,
其它线程调用countDown方法会将计数器减1(该线程不会阻塞),
当计数器的值变为0时,因调用await方法被阻塞的线程会被唤醒,继续执行。
2.3 代码实现
package jucapi;import java.util.concurrent.CountDownLatch;/*** java 常用的JUC api* CountDownLatch先看 closeDoor()** 用了枚举可以降低程序的耦合度** 需要用到自写的一个枚举*/
public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException {//大招step1CountDownLatch countDownLatch = new CountDownLatch(6);for(int i=1;i<=6;i++){//哪个线程用枚举new Thread(()->{System.out.println(Thread.currentThread().getName() + "\t国被灭");//大招step2 计数减1countDownLatch.countDown();},CountryEnum.forEach_CountryEnum(i).getRetMessage()).start(); //线程名字调用了枚举}//大招step3countDownLatch.await();System.out.println(Thread.currentThread().getName()+"\t--------秦,一统华夏");System.out.println(CountryEnum.ONE);System.out.println(CountryEnum.ONE.getRetCode());System.out.println(CountryEnum.ONE.getRetMessage());}/*** CountDownLatch* 用于理解的最简单的例子* @throws InterruptedException*/public static void closeDoor() throws InterruptedException {//大招step1CountDownLatch countDownLatch = new CountDownLatch(6);for(int i=1;i<=6;i++){new Thread(()->{System.out.println(Thread.currentThread().getName()+"\t上完晚自习,走人");//大招step2countDownLatch.countDown();},String.valueOf(i)).start();}//大招step3countDownLatch.await();System.out.println(Thread.currentThread().getName()+"\t班长关门走人");}}/*
赵 国被灭
韩 国被灭
燕 国被灭
魏 国被灭
齐 国被灭
楚 国被灭
main --------秦,一统天下
ONE
1
齐*/
(三)CyclicBarrier循环屏障
3.1 什么是CyclicBarrier?
做加法:集齐七龙珠,才能召唤神龙。
3.2 方法
//大招step1
CyclicBarrier cyclicBarrier=new CyclicBarrier(7,()->{ System.out.println(“***********召唤神龙”); });//大招step2 先来的等待
cyclicBarrier.await();
3.3 代码实现
package jucapi;import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;/*** CyclicBarrier* 翻译:循环屏障** 集齐七龙珠,才能召唤神龙* 先到的线程,先等着*/public class CyclicBarrierDemo {public static void main(String[] args) {//大招step1//CyclicBarrier(int parties, Runnable barrierAction)//注 Runnable接口的最好用lambda表达式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+"颗龙珠");//大招step2 先来的等待try {cyclicBarrier.await();} catch (InterruptedException e) {e.printStackTrace();} catch (BrokenBarrierException e) {e.printStackTrace();}},String.valueOf(i)).start();}}}/*
1 收到第:1颗龙珠
5 收到第:5颗龙珠
3 收到第:3颗龙珠
6 收到第:6颗龙珠
7 收到第:7颗龙珠
2 收到第:2颗龙珠
4 收到第:4颗龙珠
***********召唤神龙*/
(四)Semaphore信号灯
4.1 什么是Semaphore?
6辆车枪3个车位,直到6辆车都停过3秒为止,多个线程抢占多份资源
4.2 方法
//大招step1 模拟三个车位
Semaphore semaphore = new Semaphore(3);//大招step2 线程去获得车位
semaphore.acquire();//大招step3 线程3后去释放车位
semaphore.release();
4.3 代码实现
package jucapi;import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;/*** SemaphoreDemo 信号灯* 解释:6辆车枪3个车位,直到6辆车都停过3秒为止,多个线程抢占多份资源** 有减有增,有增有减** 用好了完全可以代替synchronize锁等**/
public class SemaphoreDemo {public static void main(String[] args) {//大招step1 模拟三个车位Semaphore semaphore = new Semaphore(3);for(int i=1;i<=6;i++) {new Thread(() -> {try {//大招step2 线程去获得车位semaphore.acquire();System.out.println(Thread.currentThread().getName()+"\t获得车位");//休眠3秒TimeUnit.SECONDS.sleep(3);System.out.println(Thread.currentThread().getName()+"\t停车3秒后离开车位");} catch (InterruptedException e) {e.printStackTrace();} finally {//大招step3 线程去释放车位semaphore.release();}}, String.valueOf(i)).start();}}}/*
1 获得车位
5 获得车位
2 获得车位
5 停车3秒后离开车位
1 停车3秒后离开车位
6 获得车位
2 停车3秒后离开车位
3 获得车位
4 获得车位
4 停车3秒后离开车位
3 停车3秒后离开车位
6 停车3秒后离开车位*/
如果你发现
Java_JUC_CountDownLatch/CyclicBarrier循环屏障/Semaphore信号灯/枚举相关推荐
- 并发编程之循环屏障CyclicBarrier
文章目录 前言 什么是CyclicBarrier CyclicBarrier原理 CyclicBarrier VS CountDownLatch CountDownLatch图示: CyclicBar ...
- java count 在哪一类里_java 5线程中 Semaphore信号灯,CyclicBarrier类,CountDownLatch计数器以及Exchanger类使用...
先来讲解一下Semaphore信号灯的作用: 可以维护当前访问自身的线程个数,并提供了同步机制, 使用semaphore可以控制同时访问资源的线程个数 例如,实现一个文件允许的并发访问数. 请看下面的 ...
- java 多线程分段等待执行完成状况,循环屏障CyclicBarrier | Java工具类
目录 前言 Maven依赖 代码 总结 前言 工作中是否有这样的场景,多个线程任务,如果所有线程完成到某个阶段,你希望知道所有线程均完成该阶段.当然你使用线程计数可以实现,只是不够优雅. 所以我即:j ...
- Java并发工具类-循环屏障CyclicBarrier
CyclicBarrier简介 CyclicBarrier API 构造方法 await方法 reset方法 使用样例 CyclicBarrier源码详解 CyclicBarrier中属性 构造方法及 ...
- Java多线程编程-(6)-两种常用的线程计数器CountDownLatch和循环屏障CyclicBarrier
前几篇: Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-线程本地Th ...
- 并发编程-18AQS同步组件之 CyclicBarrier 同步屏障
文章目录 J.U.C脑图 CyclicBarrier CyclicBarrier的应用场景 示例 await await(long timeout, TimeUnit unit) CyclicBarr ...
- 同步工具之CyclicBarrier循环栅栏
CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门, ...
- Objective-C 高性能的循环遍历 forin - NSEnumerator - 枚举 优化
Cocoa编程的一个通常的任务是要去循环遍历一个对象的集合 (例如,一个 NSArray, NSSet 或者是 NSDictionary). 这个看似简单的问题有广泛数量的解决方案,它们中的许多不乏 ...
- python的枚举和for循环_python入门与进阶篇(三)之分支、循环、条件与枚举,python枚举...
python入门与进阶篇(三)之分支.循环.条件与枚举,python枚举 python开发工具 IDE Vscode插件官网 https://marketplace.visualstudio.com/ ...
最新文章
- MSCKF-Based Visual-Wheel Odometry 轮速视觉融合里程计
- html img 指定旋转角度_ALLEN老师自动化测试小课堂 | 生成HTML可视化报告的两个常见模块...
- Flask框架 之abort、自定义错误、视图函数返回值与jsonify
- vc 通过句柄修改窗口大小_VC应用(1)通过VC修改销售订单行项目的字段
- 如果人工智能最终将毁灭人类,挽救人类你能做什么?
- SharePoint 2013 添加Ribbon菜单
- 互联网大厂与编程语言
- SQL存储过程和函数区别(超级简单,人人都可以看懂)
- 关于 Activity 中 must implement OnFragmentInteractionListener 的问题
- 计算机设计大赛 app一等奖,广商学子在大学生计算机设计大赛中喜获一等奖
- 解决Extraneous non-props attributes (border, class) were passed to component but could not be
- 建群网培PMP每日一练2020-7-17
- A40i linux移植ssh报错
- Android TabLayout设置选中状态标题字体大小,粗细
- 【数值分析】复化积分公式
- 2022-03-30 StackOverflowError与OutOfMemoryError详解
- 一进二出宿舍限电模块的基本功能
- App推广技巧之渠道免费资源
- Jzoj4210 我才不是萝莉控呢
- 树莓派3 打造定时播报电台音乐闹钟、天气等
热门文章
- 程序员应该了解的 “基金” 小常识
- 数据挖掘算法之时间序列算法(平稳时间序列模型,AR(p),MA(q),(平稳时间序列模型,AR(p),MA(q),ARMA(p,q)模型和非平稳时间序列模型,ARIMA(p,d,q)模型)学习笔记梳理
- 解决ifconfig命令下只出现lo本地环回的问题
- AIoT在智慧景区中的应用
- HDU 1864 最大报销额 (dp 01背包)
- 科普向 | Lucene,Solr,Elasticsearch之间的区别和联系
- mysql中的mul
- 数字信号处理的MATLAB实践(一)语音信号的录制和读取
- EMUI10的分布式技术:跨越互联、连接万物
- 文献检索是利用计算机对文献,《文献检索与利用》教学大纲(文)