Semaphore是计数信号量。Semaphore管理一系列许可证。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证,其类似于锁,可以控同时访问的线程个数,通过 acquire() 获取 一个许可,如果没有就等待,而 release() 释放一个许可。就如银行柜台办理业务一样,只有有空闲的柜台才可以为客户办理业务(这一点类似于线程池,只不过线程池是线程的可用数量,而Semaphore是资源可用数量)。
示例代码:
SemaphoreTest类:
public class SemaphoreTest {
//初始化4个锁,假设4个银行柜台
private final Semaphore semaphore = new Semaphore(4);
public void test() {
//匿名内部类的方式创建100个线程,假设100个客户
for (int i = 0; i < 100; i++) {
new Thread(new Runnable() {
public void run() {
try {
System.out.println("当前可用柜台数量为:" + semaphore.availablePermits());
semaphore.acquire();
System.out.println("客户" + Thread.currentThread().getName() + "正在柜台办理业务");
Thread.sleep(new Random().nextInt(1000));
System.out.println("客户" + Thread.currentThread().getName() + "业务办理完成");
System.out.println("当前剩余客户数量为:" + semaphore.getQueueLength());
semaphore.release();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
}
public static void main(String[] args) {
new SemaphoreTest().test();
}
}
测试结果: