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();
			}
		}
		
	}
	
	
	
}

你可能感兴趣的:(Semaphore)