RateLimiter类似于JDK的信号量Semphore,他用来限制对资源并发访问的线程数。
RateLimiter limiter = RateLimiter.create(4.0); //每秒不超过4个任务被提交 limiter.acquire(); //请求RateLimiter, 超过permits会被阻塞 executor.submit(runnable); //提交任务
也可以以非阻塞的形式来使用:
If(limiter.tryAcquire()){ //未请求到limiter则立即返回false doSomething(); }else{ doSomethingElse(); }
tryAcquire方法有另外重载的方法,我们可以设置特定的超时时间。
create(double permitsPerSecond):创建具有指定稳定吞吐量的RateLimiter类,传入允许每秒提交的任务数量。
create(double permitsPerSecond, long warmupPeriod, TimeUnit unit):创建具有指定稳定吞吐量的RateLimiter类,传入允许每秒提交的任务数量和准备阶段的时间,在这段时间RateLimiter会有个缓冲,直到达到它的最大速率(只要有饱和的足够的请求)。
setRate(double permitsPerSecond):稳定的更新RateLimiter的速率,RateLimiter的构造方法中中设置permitsPerSecond参数,调用这个方法后,当前阻塞的线程不会被唤醒,因此它们不会观察到新的速率被设置。
getRate():返回RateLimiter被设置的稳定的速率值。
acquire():从这个ratelimiter获得一个许可,阻塞线程直到请求可以再授予许可。
acquire(int permits):获取传入数量的许可,阻塞线程直到请求可以再授予许可。
tryAcquire(long timeout, TimeUnit unit):判断是否可以在指定的时间内从ratelimiter获得一个许可,或者在超时期间内未获得许可的话,立即返回false。
tryAcquire(int permits):判断是否可以立即获取相应数量的许可。
tryAcquire():判断是否可以立即获取许可。
tryAcquire(int permits, long timeout, TimeUnit unit):判断是否可以在超时时间内获取相应数量的许可。