限流型,控制并发线程数
功能概述
- 内置 一个许可证池,其中存放 数量有限、可循环使用的许可证
- 线程可申请许可证,如果池子中还有就申请的到,如果没有了就等待。线程使用完了许可证,可以归还到池子中。
- 一旦容易中有了,等待的线程就可以申请的到,继续执行。
方法介绍
- 构造函数指定了许可证的个数;还有一个是否公平竞入
- acquire:
如果许可证数量>1 ,领取一个,线程继续运行;如果许可证数量为0,线程阻塞等待,直到有其他线程归还许可证到池子中。 - release:
归还许可证,池子中可用许可证个数+1,线程继续运行,如果有排队等待许可证的线程就唤醒它们去拿许可证。 - 有可中断和非阻塞版的方法。
- acquire(int permits) :
一次申请多个许可证 - drainPermits :
一次申请全部的许可证 - tryxxx:
非阻塞式
以下方法返回的数据可能不够精确,最好用来做评估参考
int availablePermits() :返回此信号量中当前可用的许可证数。
int getQueueLength():返回正在等待获取许可证的线程数。
boolean hasQueuedThreads() :是否有线程正在等待获取许可证。
void reducePermits(int reduction) :减少reduction个许可证。是个protected方法。
Collection getQueuedThreads() :返回所有等待获取许可证的线程集合。是个protected方法。
场景案例
假如去景区旅游,如果景区只允许同时100个人进入游玩,进入的游客必须领取准入证,那么前100个游客都可以直接领取准入证进入;当剩余证件为0的时候,来的客人只能再外边吃瓜等待,等里游客游玩结束,出来一个归还一个证件,排队等的就领取一个证件进入。也可以是一次要n个证件,如果剩余的够就准入,否则就继续等剩余游玩中的游客离开后归还了足够的证件。
网友评论