限流工具RateLimiter
阿新 • • 發佈:2019-01-06
先看下demo
//1秒通過0.5個 RateLimiter rateLimiter=RateLimiter.create(0.5); for(int i=0;i<10;i++){ rateLimiter.acquire(); System.out.println(new Date()+" "+i); if (!rateLimiter.tryAcquire(1000, TimeUnit.MILLISECONDS)) { System.out.println("短期無法獲取令牌,真不幸,排隊也瞎排"); } }
RateLimiter.create(0.5);這個是配置2秒通過1個。
執行結果
可以看出2秒執行一次。
而rateLimiter.tryAcquire(1000, TimeUnit.MILLISECONDS)
是在1秒內是否能獲取到令牌token,不能的話返回false
如果併發去查詢呢?
import com.google.common.util.concurrent.RateLimiter; import java.util.Date; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; public class test3 { //1秒通過0.5個 static final RateLimiter rateLimiter=RateLimiter.create(0.5); public static void main(String[] args) { final CountDownLatch countDownLatch = new CountDownLatch(100); for(int i=0;i<100;i++){ countDownLatch.countDown(); new Thread(new Runnable() { public void run() { aaa(); } }).start(); /*try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); }*/ } } static final public void aaa(){ // for(int i=0;i<10;i++){ rateLimiter.acquire(); // System.out.println(new Date()+" "+i); System.out.println(new Date()); /*if (!rateLimiter.tryAcquire(1000, TimeUnit.MILLISECONDS)) { System.out.println("短期無法獲取令牌,真不幸,排隊也瞎排"); }*/ // } } }
執行結果
即使執行緒是併發訪問的,但是還是被限流了