【并发编程】- Semaphore

294 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

方法availablePermits()和drainPermits()

​ availablePermits()返回此Semaphore对象中当前可用的许可数量,此方法通常用于获取许可个数,因为许可的数量有可能实时在改变,并不是固定的数量。

​ drainPermits()可获取并返回立即可用的所有许可个数,并且将可用许可置为0。

运行类代码如下:

@Slf4j
public class SemaphoreDrainPermits {

    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(10);
        try {
            semaphore.acquire();
            log.info("availablePermits:{}",semaphore.availablePermits());
            log.info("drainPermits:{}",semaphore.drainPermits());
            log.info("availablePermits:{}",semaphore.availablePermits());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

程序运行的结果如下:

11:52:56.792 [main] INFO com.ozx.concurrentprogram.semaphore.controller.SemaphoreDrainPermits - availablePermits:9
11:52:56.807 [main] INFO com.ozx.concurrentprogram.semaphore.controller.SemaphoreDrainPermits - drainPermits:9
11:52:56.807 [main] INFO com.ozx.concurrentprogram.semaphore.controller.SemaphoreDrainPermits - availablePermits:0
方法getQueueLength()和hasQueuedThreads()的使用

方法getQueueLength()的作用是取得等待许可的线程个数。

方法hasQueuedThreads()的作用是判断有没有线程在等待这个许可。

这两个方法在判断当前有没有等待许可的线程信息时使用。

@Slf4j
public class SemaphoreService {
    private Semaphore semaphore = new Semaphore(1);

    public void testSemaphore(){
        try {
            semaphore.acquire();
            Thread.sleep(5000);
            log.info("还有 {} 个线程在等待",semaphore.getQueueLength());
            log.info("是否有线程正在等待信号量呢? {}",semaphore.hasQueuedThreads());
        } catch (InterruptedException e) {
            log.error("线程名:{} 进入了catch",Thread.currentThread().getName());
            e.printStackTrace();
        }finally {
            semaphore.release();
        }
    }

程序结果如下:

14:36:28.622 [Thread-0] INFO com.ozx.concurrentprogram.semaphore.service.SemaphoreService - 还有 9 个线程在等待
14:36:28.642 [Thread-0] INFO com.ozx.concurrentprogram.semaphore.service.SemaphoreService - 是否有线程正在等待信号量呢? true
14:36:33.644 [Thread-1] INFO com.ozx.concurrentprogram.semaphore.service.SemaphoreService - 还有 8 个线程在等待
14:36:33.644 [Thread-1] INFO com.ozx.concurrentprogram.semaphore.service.SemaphoreService - 是否有线程正在等待信号量呢? true
14:36:38.646 [Thread-2] INFO com.ozx.concurrentprogram.semaphore.service.SemaphoreService - 还有 7 个线程在等待
14:36:38.647 [Thread-2] INFO com.ozx.concurrentprogram.semaphore.service.SemaphoreService - 是否有线程正在等待信号量呢? true
14:36:43.648 [Thread-3] INFO com.ozx.concurrentprogram.semaphore.service.SemaphoreService - 还有 6 个线程在等待
14:36:43.648 [Thread-3] INFO com.ozx.concurrentprogram.semaphore.service.SemaphoreService - 是否有线程正在等待信号量呢? true