RateLimiter 是利用令牌桶算法
1,阻塞例子
import com.google.common.util.concurrent.RateLimiter; public class Client { public static void main(String[] args) { RateLimiter limiter = RateLimiter.create(2); for (int i = 0; i < 10; i++) { limiter.acquire(); System.out.println(System.currentTimeMillis()); } } }
从输出的时间戳可以看到每秒至多输出两条记录,起到了流量控制的效果。当使用acquire()方法时,过剩的流量调用会等待,直到有机会执行。
2,丢弃例子
import com.google.common.util.concurrent.RateLimiter; public class Client { public static void main(String[] args) { RateLimiter limiter = RateLimiter.create(2); for (int i = 0; i < 10; i++) { if(limiter.tryAcquire()){ System.out.println(System.currentTimeMillis()); } } } }