前言:
信号量可以控制某个资源可以被同时访问的个数,通过构造函数设定一定数量的许可
调用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个一起执行):