Java并发工具类Semaphore应用实例
时间:2022-07-24
本文章向大家介绍Java并发工具类Semaphore应用实例,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1 package com.thread.test.thread;
2
3 import java.util.Random;
4 import java.util.concurrent.*;
5
6 /**
7 * Semaphore
8 * Semaphore维护者一组权限,无实体权限,只是一组代表权限的数字,
9 * 每一次执行acquire都会被阻塞,直到获取获取权限,
10 * 每一次执行release都会释放权限,唤醒阻塞acquire线程
11 *
12 * Semaphore通常应用于限制资源访问
13 *
14 *
15 * Created by windwant on 2016/5/27.
16 */
17 public class MySemaphore {
18
19 public static void main(String[] args) {
20 Semaphore sp = new Semaphore(5, true); //公平性 构造函数 true
21 ExecutorService es = Executors.newCachedThreadPool();
22 Random r = new Random();
23 for (int i = 0; i < 10; i++){
24 es.execute(new Needer(sp, r.nextInt(10), "needer" + i));
25 }
26 es.shutdown();
27 }
28 }
29
30 class Needer implements Runnable{
31
32 private Semaphore sp;
33
34 private int seconds;
35
36 private String neederName;
37
38 Needer(Semaphore sp, int seconds, String neederName){
39 this.sp = sp;
40 this.seconds = seconds;
41 this.neederName = neederName;
42 }
43
44 public void run() {
45 try{
46 sp.acquire();
47 System.out.println("needer " + neederName + " begin, need time: " + seconds + "s");
48 long b = System.currentTimeMillis();
49 for (int i = 0; i < seconds; i++) {
50 Thread.sleep(1000);
51 System.out.println("needer: " + neederName + "============" + i + "============");
52 }
53 long d = System.currentTimeMillis() - b;
54 System.out.println("needer " + neederName + " over, executing time: " + TimeUnit.SECONDS.convert(d, TimeUnit.MILLISECONDS));
55 sp.release();
56 } catch (InterruptedException e) {
57 e.printStackTrace();
58 }
59 }
60 }
项目地址:https://github.com/windwant/windwant-demo/tree/master/thread-demo
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 在genome browser中添加自己的注释文件
- 原理+代码|Python基于主成分分析的客户信贷评级实战
- Python办公自动化 | 从PPT到Word
- linux命令行参数getopts参数二选一
- 黎巴嫩首都爆炸能量有多大?物理学家看视频计算:300吨TNT!
- OracleDG 环境主备业务数据不同步备库报ORA-600错误的处理过程
- Xcode清理模拟器文件
- 【Android 音视频开发打怪升级:FFmpeg音视频编解码篇】六、FFmpeg简单合成MP4:视屏解封与重新封装
- 32.opengl高级光照-延迟着色法
- Tsunami:一款功能强大的通用网络安全扫描工具
- Hive查看表/分区更新时间
- 直接通过手机抓取GPS的qxdm日志
- uniapp常用提示框uni.showToast(OBJECT)
- MySQL 索引(3)
- TS 设计模式04 - 适配器模式