并发tools之信号量Semaphore

xiaoxiao2025-05-23  30

前言:

信号量可以控制某个资源可以被同时访问的个数,通过构造函数设定一定数量的许可

调用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个一起执行):

转载请注明原文地址: https://www.6miu.com/read-5030568.html

最新回复(0)