java Semaphore信号灯
Semaphore实现的功能就类似2个公用电话,假如有10个人要打电话;那么只能2个人占有电话,8个需要等待。
当2个人中 的任何一个人让开后,其中等待的另外8个人中又有一个人可以使用了
等待的8个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,这取决于构造Semaphore对象时传入的参数选项。
单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了锁,再由另一个线程释放锁,这可应用于死锁恢复的一些场合。
Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数。
Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可通过release() 释放一个许可
案例:
public class SemaphoreTest{ public static void main(String[] args) { ExecutorService pool = Executors.newCachedThreadPool(); //2个公用电话 可以通过true/false决定获取许可证顺序 final Semaphore sp = new Semaphore(2,true); //10个需要打电话 for(int i=1;i<=10;i++){ Runnable runnable = new Runnable(){ public void run(){ try { sp.acquire(); } catch (InterruptedException e1) {} System.out.println("线程" + Thread.currentThread().getName() + "获取通话,当前还有" + sp.availablePermits()+ "个电话可以用"); try { Thread.sleep((long)(Math.random()*1000)); } catch (InterruptedException e) {} System.out.println("线程" + Thread.currentThread().getName() + "即将离开 "); sp.release(); } }; pool.execute(runnable); } pool.shutdown(); } } 结果输出:
线程pool-1-thread-1获取通话,当前还有0个电话可以用
线程pool-1-thread-3获取通话,当前还有0个电话可以用
线程pool-1-thread-3即将离开
线程pool-1-thread-5获取通话,当前还有0个电话可以用
线程pool-1-thread-1即将离开
线程pool-1-thread-2获取通话,当前还有0个电话可以用
线程pool-1-thread-2即将离开
线程pool-1-thread-7获取通话,当前还有0个电话可以用
线程pool-1-thread-5即将离开
线程pool-1-thread-6获取通话,当前还有0个电话可以用
线程pool-1-thread-7即将离开
线程pool-1-thread-9获取通话,当前还有0个电话可以用
线程pool-1-thread-6即将离开
线程pool-1-thread-4获取通话,当前还有0个电话可以用
线程pool-1-thread-9即将离开
线程pool-1-thread-10获取通话,当前还有0个电话可以用
线程pool-1-thread-10即将离开
线程pool-1-thread-8获取通话,当前还有0个电话可以用
线程pool-1-thread-4即将离开
线程pool-1-thread-8即将离开
java Semaphore信号灯的更多相关文章
- java 5线程中 Semaphore信号灯,CyclicBarrier类,CountDownLatch计数器以及Exchanger类使用
先来讲解一下Semaphore信号灯的作用: 可以维护当前访问自身的线程个数,并提供了同步机制, 使用semaphore可以控制同时访问资源的线程个数 例如,实现一个文件允许的并发访问数. 请看下面 ...
- Java多线程——Semaphore信号灯
Semaphore可以维护当前访问自身的线程个数,并提供了同步机制.使用Semaphore可以控制同时访问资源的线程个数(即允许n个任务同时访问这个资源),例如,实现一个文件允许的并发访问数. Sem ...
- java Semaphore
//Listing 6-4. Using a Counting Semaphore to Control Access to a Pool of Items import java.util.conc ...
- java Semaphore的介绍和使用
一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可.每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者. ...
- ArrayBlockingQueue 阻塞队列和 Semaphore 信号灯的应用
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public cl ...
- System IPC 与Posix IPC(semaphore信号灯)
POSIX下IPC主要包括三种: posix message queue posix semaphores posix shared memory sysytem v IPC包括: system v ...
- java Semaphore信号亮-同意多个任务同一时候訪问这个资源--thinking in java21.7.6
package org.rui.thread.newc.semaphore; import java.util.ArrayList; import java.util.List; import jav ...
- java Semaphore实现ABC三个线程循环打印
Semaphore位于java.util.concurrent包下.其中有两个重要的方法acquire()和release().acquire用来获取一个信号量,并且是阻塞型的,如果当前还有可用的信号 ...
- JAVA Semaphore详解
Semaphore(信号量):是一种计数器,用来保护一个或者多个共享资源的访问.如果线程要访问一个资源就必须先获得信号量.如果信号量内部计数器大于0,信号量减1,然后允许共享这个资源:否则,如果信号量 ...
随机推荐
- 05-CSS浮动、定位、页面布局
# 浮动 ### 文档流文档流,是指盒子按照html标签编写的顺序依次从上到下,从左到右排列,块元素占一行,行内元素在一行之内从左到右排列,先写的先排列,后写的排在后面,每个盒子都占据自己的位置. # ...
- vue项目上传到OSS
1.输入阿里云登陆地址 http://signin.aliyun.com/1987179281335458/login.htm 登陆地址 阿里云账号 2.选择对象oss,建议文件夹 3.将文 ...
- 361-基于6U VPX TMS320C6678+XC7K325T 的信号处理板
基于6U VPX TMS320C6678+XC7K325T 的信号处理板 一.板卡概述 本板卡基于6U VPX结构设计无线电信号处理平台.板卡包含1片C6678芯片,1片 FPGA XC7K325T- ...
- join 按两个文件的相同字段合并
1.命令功能 join对每一对具相同内容的输入行,合并为一行输出.默认情况是把输入的第一个字段作为连接字段,字段间用空格隔开. 2.语法格式 join option file1 file2 jo ...
- pandas数据查询(数值、列表、区间、条件、函数)
import pandas as pd # 0 读取数据 df = pd.read_csv("文件路径")#例子是北京一年的天气情况 df.head()#查看表头 # 设定索引为日 ...
- cmd获取管理员权限等
鼠标点点点的略过 可输入命令 runas /user:Administrator cmd 或 runas /noprofile /user:Administrator cmd Administrato ...
- java 小数精确计算
小数精确计算 System.out.println(2.00 -1.10);//0.8999999999999999 上面的计算出的结果不是 0.9,而是一连串的小数.问题在于1.1这个数字不能被精确 ...
- Python---基础---dict和set
2019-05-20 ------------------------------ 写一个程序来管理用于登陆系统的用户信息:登录名字和密码,登录用户账号建立后,已存在用户可以用登陆名字和密码重返系统, ...
- JavaScript 函数防抖
<!DOCTYPE html><html lang="zh-cmn-Hans"> <head> <meta charset="u ...
- 百度ueditor新增的将word内容导入到富文本编辑框的功能.
如何做到 ueditor批量上传word图片? 1.前端引用代码 <!DOCTYPEhtmlPUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN& ...