Semaphore的简单理解
来源:互联网 发布:聚划算淘宝商城特价区 编辑:程序博客网 时间:2024/05/19 22:25
Semaphore的概念
Semaphore是一个计数器信号量,它维护了一个许可集合,用来控制对一定资源的消费与回收。当线程调用acquire()方法时,如果许可不足,那么线程将block,直到有许可可用。release()方法则会释放一个许可。
Semaphore的用法
Semaphore提供了两个构造方法:
public Semaphore(int permits) { //参数permits表示许可数目,即同时可以允许多少线程进行访问 sync = new NonfairSync(permits);}public Semaphore(int permits, boolean fair) { //这个多了一个参数fair表示是否是公平的,即等待时间越久的越先获取许可 sync = (fair)? new FairSync(permits) : new NonfairSync(permits);}
下面说一下Semaphore类中比较重要的几个方法,首先是acquire()、release()方法:
public void acquire() throws InterruptedException { } //获取一个许可public void acquire(int permits) throws InterruptedException { } //获取permits个许可public void release() { } //释放一个许可public void release(int permits) { } //释放permits个许可
acquire()用来获取一个许可,若无许可能够获得,则会一直等待,直到获得许可。
release()用来释放许可。注意,在释放许可之前,必须先获获得许可。
这4个方法都会被阻塞,如果想立即得到执行结果,可以使用下面几个方法:
public boolean tryAcquire() { }; //尝试获取一个许可,若获取成功,则立即返回true,若获取失败,则立即返回falsepublic boolean tryAcquire(long timeout, TimeUnit unit) throws InterruptedException { }; //尝试获取一个许可,若在指定的时间内获取成功,则立即返回true,否则则立即返回falsepublic boolean tryAcquire(int permits) { }; //尝试获取permits个许可,若获取成功,则立即返回true,若获取失败,则立即返回falsepublic boolean tryAcquire(int permits, long timeout, TimeUnit unit) throws InterruptedException { }; //尝试获取permits个许可,若在指定的时间内获取成功,则立即返回true,否则则立即返回false
另外还可以通过availablePermits()方法得到可用的许可数目。
下面通过一个例子来看一下Semaphore的具体使用:
假若一个工厂有5台机器,但是有8个工人,一台机器同时只能被一个工人使用,只有使用完了,其他工人才能继续使用。那么我们就可以通过Semaphore来实现:
public class Test { public static void main(String[] args) { int N = 8; //工人数 Semaphore semaphore = new Semaphore(5); //机器数目 for(int i=0;i<N;i++) new Worker(i,semaphore).start(); } static class Worker extends Thread{ private int num; private Semaphore semaphore; public Worker(int num,Semaphore semaphore){ this.num = num; this.semaphore = semaphore; } @Override public void run() { try { semaphore.acquire(); System.out.println("工人"+this.num+"占用一个机器在生产..."); Thread.sleep(2000); System.out.println("工人"+this.num+"释放出机器"); semaphore.release(); } catch (InterruptedException e) { e.printStackTrace(); } } }}
执行结果:
工人0占用一个机器在生产...工人1占用一个机器在生产...工人2占用一个机器在生产...工人4占用一个机器在生产...工人5占用一个机器在生产...工人0释放出机器工人2释放出机器工人3占用一个机器在生产...工人7占用一个机器在生产...工人4释放出机器工人5释放出机器工人1释放出机器工人6占用一个机器在生产...工人3释放出机器工人7释放出机器工人6释放出机器
参考资料:http://www.importnew.com/21889.html
阅读全文
0 0
- Semaphore的简单理解
- Semaphore, CountDownLatch,CyclicBarrier 简单理解
- Semaphore 的理解
- 理解JAVA的Semaphore信号量
- 线程Semaphore的简单实例
- 对信号量Semaphore的理解与运用
- Java中信号量Semaphore的简单使用
- java5的Semaphore同步工具简单实例
- 理解Semaphore和Mutex
- 理解Semaphore和Mutex
- 线程中的Semaphore理解
- 理解Semaphore和Mutex
- Semaphore(信号量)理解
- 深入理解Semaphore
- java并发工具Semaphore的理解和使用
- 理解Semaphore及其用法详解
- 理解Semaphore及其用法详解
- 理解Semaphore及其用法详解
- OpenJudge百炼-2744-子串-C语言-字符串处理
- 再识Java泛型
- 2:正常血压(程序设计与算法(一)第四周测验(2017夏季)
- 进程控制3——进程终止和等待
- scala中的map和tuple
- Semaphore的简单理解
- 低版本的Xcode如何连接高版本的真机进行调试
- Android Studio编绎流程
- 对线性回归、逻辑回归、各种回归的概念学习
- monkey基本命令参数详解示例
- Lambda表达式
- laravel 'Data Missing'
- Scheduled定时作业
- JAVA设计模式之四:原型模式