一、什么是Semaphore
Semaphore [ˈsɛməˌfɔr] 信号量,是JUC包下的一个工具类,它用于控制同时访问特定资源的线程数量,控制并发线程数。
Semaphore两个重要的方法
- semaphore.acquire(): 请求一个信号量,这时候的信号量个数-1(一旦没有可使用的信号量,也即信号量个数变为负数时,再次请求的时候就会阻塞,直到其他线程释放了信号量)
- semaphore.release():释放一个信号量,此时信号量个数+1
二、使用场景
我们可以通过其限制执行的线程数量,达到限流的效果
当一个线程执行时先通过其方法进行获取许可操作,获取到许可的线程继续执行业务逻辑,当线程执行完成后进行释放许可操作,未获取达到许可的线程进行等待或者直接结束。
三、代码实现
publicclassSemaphoreCase { publicstaticvoidmain(String[] args) { // 1. 创建 semaphore 对象Semaphoresemaphore=newSemaphore(2); // 2. 5个线程同时运行for (inti=0; i<5; i++) { newThread(() -> { try { // 3. 获取许可semaphore.acquire(); } catch (InterruptedExceptione) { e.printStackTrace(); } try { System.out.println(Thread.currentThread().getName() +"running..."); try { Thread.sleep(1000); } catch (InterruptedExceptione) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() +"end..."); } finally { // 4. 释放许可semaphore.release(); } }).start(); } } }
四、打印结果
Thread-1running... Thread-0running... Thread-1end... Thread-0end... Thread-2running... Thread-3running... Thread-3end... Thread-2end... Thread-4running... Thread-4end... Processfinishedwithexitcode0