本文主要是介绍java多线程【Semaphore】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
环境
java: 1.7
简单使用
最近再看恒生给的demo
,其中Semaphore
因为我没有使用过,就网上找了个通俗易懂的例子,自己消化下。
Semaphore
中文表示的信号量,用于对资源访问控制。
小例子
也是参考网上的:
package semaphore;import java.util.concurrent.Semaphore;public class SemaphoreTest extends Thread{private int num = 0;private Semaphore sm = null;public SemaphoreTest(int num, Semaphore sm){this.num = num;this.sm = sm;}public static void main(String[] args) {//五个机器,8人工人,一个工人只能操作一台机器Semaphore sp = new Semaphore(5); //五个机器 这里5表示许可数据,即 同时允许5个访问资源for(int i=0; i<8; i++){new SemaphoreTest(i, sp).start();}}@Overridepublic void run() {try {sm.acquire();System.out.println("工人" + num + "占用一个机器");System.out.println("可用许可数量" + sm.availablePermits());System.out.println("工人" + num + "释放机器");sm.release();} catch (InterruptedException e) {e.printStackTrace();} }
}
结果:
工人0占用一个机器
工人1占用一个机器
工人3占用一个机器
可用许可数量1
工人3释放机器
工人2占用一个机器
工人4占用一个机器
可用许可数量3
可用许可数量1
工人2释放机器
可用许可数量1
可用许可数量1
工人0释放机器
工人5占用一个机器
可用许可数量2
工人5释放机器
工人4释放机器
工人1释放机器
工人6占用一个机器
可用许可数量3
工人7占用一个机器
工人6释放机器
可用许可数量3
工人7释放机器
主要的方法
方法名 | 描述 |
---|---|
acquire() | 用来获取一个许可,若无许可能够获得,则会一直等待,直到获得许可。 |
release() | 用来释放许可。注意,在释放许可之前,必须先获获得许可。 |
acquire(int permits) | 获取permits个许可 |
release(int permits) | 释放permits个许可 |
tryAcquire() | 尝试获取一个许可,若获取成功,则立即返回true,若获取失败,则立即返回false |
tryAcquire(long timeout,TimeUnit unit) | 尝试获取一个许可,若在指定的时间内获取成功,则立即返回true,否则则立即返回false |
tryAcquire(int permits) | 尝试获取permits个许可,若获取成功,则立即返回true,若获取失败,则立即返回false |
tryAcquire(int permits, long timeout, TimeUnit unit) | 尝试获取permits个许可,若在指定的时间内获取成功,则立即返回true,否则则立即返回false |
availablePermits | 得到可用的许可数目 |
这篇关于java多线程【Semaphore】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!