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,然后允许共享这个资源:否则,如果信号量 ...
随机推荐
- fullpage.js版本3.0.5报错问题(licenseKey)
在文件里搜索licenseKey,删除!不会对程序造成任何影响
- 使用Tabulator遇到的问题
1.Tabulator好像是不支持ie,按照Tabulator文档引入,打开浏览器总是报缺少文件,换了谷歌果然好了. 2.编辑某一行的数据 代码: //Build Tabulator var tabl ...
- iOS 应用配置及证书生成教程
简介 首先你需要有一个苹果的开发者帐号,一台苹果电脑.点击查看苹果开发者账号注册流程 本教程需完成应用信息配置,包括如下两个基本配置: AppID Bundle ID 同时,生成 如下三个证书文件及对 ...
- 本地主机访问远程linux系统服务器上的jupyter notebook
1,机器情况:服务器 centos python环境已经配置好了,在虚拟环境下安装了anaconda 并且在里面安装了jupyter notebook 2,主机是 windows ipytho ...
- objectMaaper 反序列化json字段多于或少于实体处理
两种方式 1 忽略json上未知的字段 设置实体类注解 @JsonIgnoreProperties(ignoreUnknown = true) public class Foo { ... } 2 配 ...
- python3-定义函数
在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 我们以自定义一个求绝对值的my_abs函数 ...
- man uname
UNAME(1) User Commands/用户命令 UNAME(1) NAME/名称 uname - print system information/打 ...
- 笔记-CSS-e:nth-chid
1,CSS 2,
- FastDFS的安装及上传下载(二)
百度云:所有附件的地址 一 安装前的检查 检查Linux上是否安装了 gcc.libevent.libevent-devel,执行如下yum命令检查: [root@node02 ~]# yum lis ...
- 【转】Django 模板语法
转自:https://www.cnblogs.com/love9527/p/9077863.html Django 模板语法 一.模板 只要是在html里面有模板语法就不是html文件了,这样的文件就 ...