转载:https://blog.csdn.net/xiaojin21cen/article/details/87376212
1.介绍
Semaphore 是一个计数信号量。
- 从概念上将,Semaphore 包含一组许可证。
- 如果有需要的话,每个
acquire()
方法都会阻塞,直到获取一个可用的许可证。 - 每个
release()
方法都会释放持有许可证的线程,并且归还 Semaphore 一个可用的许可证。 - 然而,实际上并没有真实的许可证对象供线程使用,Semaphore 只是对可用的数量进行管理维护。
2.Semaphore 方法说明
2.1、构造函数
Semaphore(permits)
Semaphore(permits,fair)
permits:初始化许可证数量
fair:是否公平模式
2.2、方法
-
1、
isFair()
是否公平模式 FIFO -
2、
availablePermits()
获取当前可用的许可证数量 -
3、
acquire()
、acquire(permits)
当前线程尝试去阻塞的获取permits
个许可证。( permits >= 1)
此过程是阻塞的,它会一直等待许可证,直到发生以下任意一件事:- 当前线程获取了n个可用的许可证,则会停止等待,继续执行。
- 当前线程被中断,则会抛出
InterruptedException
异常,并停止等待,继续执行。
-
4、
acquierUninterruptibly()
、acquireUninterruptibly(permits)
当前线程尝试去阻塞的获取permits
个许可证。 ( permits >= 1)
此过程是阻塞的,它会一直等待许可证,直到发生以下任意一件事:- 当前线程获取了n个可用的许可证,则会停止等待,继续执行。
-
5、
tryAcquire()
、tryAcquire(permits)
、
当前线程尝试去获取permits
个许可证。
此过程是非阻塞的,它只是在方法调用时进行一次尝试。- 如果当前线程获取了
permits
个可用的许可证,则会停止等待,继续执行,并返回 true。 - 如果当前线程没有获得
permits
个许可证,也会停止等待,继续执行,并返回 false 。
- 如果当前线程获取了
-
6、
tryAcquire(timeout,TimeUnit)
、tryAcquire(permits,timeout,TimeUnit)
当前线程在限定时间内,阻塞的尝试去获取 permits 个许可证。
此过程是阻塞的,它会一直等待许可证,直到发生以下任意一件事:- 当前线程获取了可用的
permits
个许可证,则会停止等待,继续执行,并返回true。 - 当前线程等待时间
timeout
超时,则会停止等待,继续执行,并返回false。 - 当前线程在
timeout
时间内被中断,则会抛出InterruptedException
一次,并停止等待,继续执行。
- 当前线程获取了可用的
-
7、
release()
、release(permits)
当前线程释放 permits 个可用的许可证 。( permits >= 1) -
8、
drainPermits()
当前线程获得剩余的所有可用许可证 -
9、
hasQueuedThreads()
判断当前 Semaphore 对象上是否存在正在等待许可证的线程 -
10、
getQueueLength()
获取当前 Semaphore 对象 上是正在等待许可证的线程数量