版权声明:本文为博主原创文章,转载请指明出处: https://blog.csdn.net/qq_34178598/article/details/83376288
前言:
信号量可以控制某个资源可以被同时访问的个数,通过构造函数设定一定数量的许可
调用acquire()获取一个许可,如果没有就等待
调用release()释放一个许可.
实战:(下面例子只允许5个线程同时进入执行acquire()和release()之间的代码)
public class SemaphoreDemo {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
//只能5个线程同时访问
final Semaphore semp = new Semaphore(5);
for (int index = 0; index < 20; index++) {
final int NO = index;
Runnable run = () -> {
try {
//获取许可
semp.acquire();
System.out.println("Accessing: "+NO);
Thread.sleep(3000L);
//访问完后,释放,如果注释下面的语句,则在控制台只能
//打印5条记录,之后线程一直阻塞
semp.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
};
executorService.execute(run);
}
executorService.shutdown();
}
}
运行结果(5个5个一起执行):