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
- flash/flex 与 FluorineFx通讯之Hello World!
- 苹果CEO首次泄露出自动驾驶汽车的相关战略信息
- Linux下绑定网卡的操作记录
- flash开发中如何实现界面代码分离
- flex中使用swc实现更好的界面代码分离
- Redis Cluster集群总结性梳理
- jquery的html,text,val
- Redis Cluster日常操作命令梳理
- MongoDB数据存储-深入了解
- Linux下通过受限bash创建指定权限的账号
- “AS3.0高级动画编程”学习:第四章 寻路(AStar/A星/A*)算法 (上)
- MongoDB副本(一主一备+仲裁)环境部署记录
- 根据前后的子串求中间串的函数
- Centos6下zookeeper集群部署记录
- 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 文档注释
- Flutter使用StatefulWidget有状态组件累计添加数组
- SpringMVC系列一
- Flutter循环Json数组
- Flutter组件随笔练习
- TKE 容器健康检查最佳实践
- 微信小程序修改checkbox和radio的样式
- TRTC Android端开发接入学习之实现实时屏幕分享(四)
- Vue使用组件递归实现评论盖楼功能笔记
- 自监督注意力在密集光流估计中的应用
- SpringBoot+MyBatis+Spring 技术整合实现商品模块的CRUD操作
- 什么?面试官让我用ArrayList实现一个阻塞队列?
- A little fun with InnoDB multi-versioning(14.有关InnoDB多版本中的一个小问题)
- 聊聊java中的哪些Map:(八)ConcurrentSkipListMap源码分析
- littlevgl(Lvgl)最新版V7.4移植
- TiKV 源码解析系列文章(二十)Region Split 源码解析