java concurrent - semaphore(许可集)的作用

semaphore 作为一个计数信号量,也可认为是一个许可集,通过许可的获取(acquire)和释放(release)来控制访问内容的线程数量;

当设置信号量为1时,可以作为一个琐来使用;


/**
 * 模拟乘客车站排队买票(不是使用排队的模式,而是使用争抢买票的模式)
 *
 */
public class SemaphoreUtil implements Runnable{
	
	/*当前为第几人*/
	private int nowPNum;
	/*管理人员*/
	private Semaphore semaphore;
	
	public SemaphoreUtil(int nowPNum, Semaphore semaphore){
		this.nowPNum = nowPNum;
		this.semaphore = semaphore;
	}
	
	public void run(){
		/*查看是否有空闲窗口*/
		if(semaphore.availablePermits() > 0){
			System.out.println("当前买票人为第" + nowPNum + "人,有空闲窗口");
		}else{
			System.out.println("当前买票人为第" + nowPNum + "人,无空闲窗口");
		}
		try {
			/*颁发一个许可*/
			semaphore.acquire();
			System.out.println("第" + nowPNum + "人开始买票");
			Thread.sleep(5*1000);
			System.out.println("第" + nowPNum + "人买票结束");
			/*释放许可*/
			semaphore.release();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		
	}
	
	public static void main(String[] args){
		ExecutorService excetor = Executors.newCachedThreadPool();
		Semaphore semaphore = new Semaphore(2);
		for(int i = 0;i < 10;i++){
			SemaphoreUtil s = new SemaphoreUtil((i + 1), semaphore);
			excetor.execute(s);
		}
		excetor.shutdown();
	}
}

semaphore一般可以使用在排队购票、排队上车等多人员访问少数资源的场景中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值