信号量,一个计数信号量;用于控制可同时执行的线程总数。
从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。
河面上有五座独木桥,每个独木桥只能承载一个人,100个人要过桥,只能一个一个排队,过桥期间最多只能同时有5个人在过桥(每桥一个人),当某座桥上的人到了对面,马上就会有另外一个人上桥,直到最后100个人都到了对面,怎么做?用Semaphore(信号量)。
常用方法
- acquire(); // 获得一个许可,没有许可则一直阻塞
- release(); // 释放一个许可
- tryAcquire(); //尝试获得一个许可,获取成功返回true,否则false
栗子
public static void main(String[] args) {
ExecutorService executors=Executors.newFixedThreadPool(20);
final Semaphore semaphore=new Semaphore(5);
for(int i=0;i<20;i++){
final int n=i;
new Thread(new Runnable() {
public void run() {
try {
semaphore.acquire();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(n);
semaphore.release();
}
}).start();
}
}