Semaphore是一个计数信号量。从概念上讲,信号量维护了一个许可集合。如有必要,在许可可用前会阻塞每一个 acquire()
,然后再获取该许可。每个 release()
添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore只对可用许可的号码进行计数,并采取相应的行动。Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目.
小实例:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
/**
* 并发库中的信号灯
*/
public class SemaphoreDemo {
/**
* @param args
*/
public static void main(String[] args) {
ExecutorService pool=Executors.newCachedThreadPool();
final Semaphore light=new Semaphore(3);
for(int i=0;i<10;i++){
final int index=i;
pool.execute(new Thread(new Runnable() {
public void run() {
try {
light.acquire(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" "+index);
light.release();
}
}));
}
}
}