一、什么是信号量
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。在多线程中经常会遇到该应用场景,信号量如同交通公路中的红绿灯一样,需要限流,举例如下:
高速路线的承载有限,只能允许100辆车在高速路行驶,如何控制呢?就需要红路灯来限制,若发现高速路段路段有100辆车,则信号量控制,不让车驶入;若发现有10辆车驶出,则信号量方向10辆车;
二、多线程中的应用
Semaphore semaphore = new Semaphore(5);
System.out.println("开始");
for(int i = 0;i < 10; i++) {CompletableFuture.runAsync(() -> {try {semaphore.acquire();System.out.println(Thread.currentThread().getId() + "异步线程aaaaaaaaa");ThreadUtil.sleep(1000 * 1);} catch (InterruptedException e) {throw new RuntimeException(e);} finally {semaphore.release();}});
}
初始化5个信号量,CompletableFuture异步线程获取一个许可,然后线程等待1s,执行时候发现,第一秒打印5条,第二秒打印5条;若初始化信号量10个,则执行发现第一秒打印10条。
三、信号量的其他方法
1.semaphore.acquire(5) 获取5个信号量,每次全部获取,则线程都会等待
2.semaphore.tryAcquire() 尝试获取一个许可,如果未获取到,不等待,将直接丢弃该线程不执行
Semaphore semaphore = new Semaphore(5);System.out.println("开始");for(int i = 0;i < 10; i++) {CompletableFuture.runAsync(() -> {if(semaphore.tryAcquire()) {System.out.println(Thread.currentThread().getId() + "异步线程aaaaaaaaa");ThreadUtil.sleep(1000 * 1);semaphore.release();}});}