Semaphore可以维护当前访问自身的线程个数,并提供了同步机制,使用Semaphore可以控制同时访问资源的个数。举一个通俗的例子:厕所里有5个坑,加入有十个人要上厕所,那么同时只能有5个人能够占用,当这5个人中的任何一个人用完之后,等待的5个人中又有一个人可以占用。
方法:
acquire():霸占一个信号灯。
availablePermits():获取可以提供的信号灯。
release():释放信号灯。
案例:
public class SemaphoreTest {
public static void main(String[] args) {
/*创建一个线程池*/
ExecutorService executorService = Executors.newCachedThreadPool();
/*创建一个信号灯对象【初始化3个灯】*/
final Semaphore semaphore = new Semaphore(3);
for (int i=0; i<10;i++){
Runnable runnable = new Runnable() {
@Override
public void run() {
/*************获取一个信号灯************/
try {
semaphore.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() +", 进入,当前已有 " + (3 - semaphore.availablePermits()) +"并发");
/************休眠******************/
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/**************释放信号灯*************/
System.out.println(Thread.currentThread().getName() +"即将离开");
semaphore.release();//释放信号灯
System.out.println(Thread.currentThread().getName() +", 已离开,当前还有 " + (3 - semaphore.availablePermits()) +"并发");
}
};
/*执行*/
executorService.execute(runnable);
}
}
}