一起养成写作习惯!这是我参与「掘金日新计划 · 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