突击并发编程JUC系列-并发工具 Semaphore
时间:2022-07-26
本文章向大家介绍突击并发编程JUC系列-并发工具 Semaphore,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
突击并发编程JUC系列演示代码地址: https://github.com/mtcarpenter/JavaTutorial
前面两个章节学习了 CountDownLatch
和 CyclicBarrier
,他们都是递减同步器,今天学习递增同步器 Semaphore
。
Semaphore
(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。看到这个信号量我的脑海中就出现了红绿灯,为了保证学生的安全,学校的十字路口一般都设有红绿灯,车流量控制,每一次绿灯同时能通行 100 辆汽车,没有在绿灯通行的汽车都会被阻塞,直到下一次绿灯。
新日学校植树节活动,植树节地点中途必须通过一个红绿灯的十字路口,红绿灯的十字路口每次时间有限,一次红绿灯的时间只能通过两个年级的同学,示例如下:
public class SemaphoreExample1 {
private final static int gradeNum = 6;
private static Semaphore semaphore = new Semaphore(2);
public static void main(String[] args) throws Exception {
ExecutorService exec = Executors.newScheduledThreadPool(gradeNum);
System.out.println("校门口红绿灯等待中.....");
for (int i = 0; i < gradeNum; i++) {
int gradeName = i + 1;
exec.submit(() -> {
try {
// 获取一个许可
semaphore.acquire();
wait(gradeName);
// 释放一个许可
semaphore.release();
} catch (Exception e) {
}
});
}
exec.shutdown();
}
private static void wait(int gradeName) throws Exception {
TimeUnit.SECONDS.sleep(1);
System.out.println(gradeName + "年级通过红绿灯......");
}
}
运行结果如下:
校门口红绿灯等待中.....
1年级通过红绿灯......
2年级通过红绿灯......
4年级通过红绿灯......
3年级通过红绿灯......
5年级通过红绿灯......
6年级通过红绿灯......
大家运行此段代码会发现控制台,两个子线程同时打印。
- 封装好的MAP工具类和HBASE工具类
- JSP+ajax+springMVC+MayBatis处理excel上传导入
- 绚丽的javascript拾色器(不兼容IE8及以下)
- 魔波广告恶意病毒简析
- javascript生成.xls文件(兼容IE&Chrome&Firefox)
- 没用的程序设计题-美甲帮笔试题
- MongoDB Java
- JSON.parse()和JSON.stringify()
- jquery获取主机地址和端口
- 前端验证码绘制(canvas)
- 关于机器学习在网络安全中的五大误解
- 打造专属插件之Easy Slider Bar
- java asm 框架 浅析
- 酷炫的progressbar(上限可大于100%)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法