在如下的场景,我们可能需要加入类似许可证的实现:
有一个资源队列,不管在什么情况下,都只允许指定数目的资源被使用,资源被使用,并归还之后,新的任务才能使用这些资源。
有一个资源队列,不管在什么情况下,都只允许指定数目的资源被使用,资源被使用,并归还之后,新的任务才能使用这些资源。
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();
}
}
}
}