Semaphore--给队列加上许可证

在如下的场景,我们可能需要加入类似许可证的实现:

有一个资源队列,不管在什么情况下,都只允许指定数目的资源被使用,资源被使用,并归还之后,新的任务才能使用这些资源。


public class TestSemaphore {
static int count=0;
Random r=new Random(47);
BlockingQueue<Integer> queue=new LinkedBlockingQueue<Integer>();
[b]Semaphore s=new Semaphore(5);[/b]

public void testSemaphore(){
for(int i=0;i<8;i++){
try {
queue.put(i);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

ExecutorService se=Executors.newCachedThreadPool();
for(int i=0;i<40;i++){
se.execute(new Consumer());
}
}

public static void main(String args[]){
new TestSemaphore().testSemaphore();
}


class Consumer implements Runnable{
int id=count++;
public void run() {
try {
[b]s.acquire();[/b]
int value=queue.take();
out.println("#"+id+" Take value ["+value+"], Left "+queue.toString()+"");
TimeUnit.SECONDS.sleep(r.nextInt(60));

queue.put(value);
out.println("#"+id+" Return back value ["+value+"], Left "+queue.toString()+"");
[b]s.release();[/b]
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}



}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值