概念
计数信号量。从概念上讲,信号量维护一组许可证。
举一个例子
某银行分店只有三个窗口,所以同一时间最多只有三个人办理业务,其它人只能等待。可以把办理业务的人比作成线程,三个窗口就相当于三个许可证。此时来了4个人,先到的三个领到人许可证然后办理业务,第四个人呢只有等待,等待其中一个先办好业务释放许可证之后,然后再办理业务。
简单的用法
调用aquire
方法是阻塞的直到有一个许可
可用然后返回。每次调用release
方法就会增加一个许可
,隐式地释放一个阻塞获取者(调用aquire
方法阻塞的线程)。当然没有所谓实际的许可对象
,Semaphore
仅仅是维护了一个数字而已,然后执行相应的减加操作而已。
一个demo?
public class SemaphoreDemo {
public static final int THREAD_SIZE = 10;
public static void runSomething() throws InterruptedException {
//模拟处理什么事
Thread.sleep(1000);
System.out.println(String.format("current threadId is %d,current time is %d",
Thread.currentThread().getId(), System.currentTimeMillis() / 1000));
}
public static void main(String[] args) throws InterruptedException {
//创建一个包含4个许可证的信号量实例
Semaphore semaphoreDemo = new Semaphore(4);
for (int i = 0; i < THREAD_SIZE; i++) {
//获取许可
Thread demoThread = new Thread(() -> {
try {
//获取许可
semaphoreDemo.acquire();
//操作资源
runSomething();
} catch (InterruptedException e) {
//抛出InterruptedException 会将该线程的中断标志设置为false
Thread.currentThread().interrupt();
} finally {
semaphoreDemo.release();
}
});
//开启demo线程
demoThread.start();
}
}
}