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):判斷是否可以在超時時間內獲取相應數量的許可。