RateLimiter 从概念上来讲,速率限制器会在可配置的速率下分配许可证。如果必要的话,每个acquire() 会阻塞当前线程直到许可证可用后获取该许可证。一旦获取到许可证,不需要再释放许可证。
简单示例
public static void main(String[] args) {
RateLimiter rateLimiter = RateLimiter.create(2);
System.out.println(rateLimiter.acquire(5));
System.out.println(rateLimiter.acquire(2));
System.out.println(rateLimiter.acquire(1));
}
多线程测试
package com.ky.common;
import com.google.common.util.concurrent.RateLimiter;
import com.ky.core.utils.date.DateUtils;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @Author: fang
* @Date: 2018/11/14 17:04
*/
public class Test {
private static final RateLimiter rateLimiter = RateLimiter.create(2);
public static class WorkerThread implements Runnable {
int i;
WorkerThread(int i){
this.i = i;
}
@Override
public void run() {
send(i);
}
}
public static void send(int i){
rateLimiter.acquire();
System.out.println("thread"+i+",当前时间:"+ DateUtils.getNowTime());
}
public static void run(){
ExecutorService executor = Executors.newFixedThreadPool(50);
for (int i = 0; i < 50; i++) {
Runnable runnable = new WorkerThread(i);
executor.execute(runnable);
}
executor.shutdown();
while (!executor.isTerminated()) {
}
System.out.println("Finished all threads");
}
public static void main(String args[]) {
run();
}
}
参考:
http://ifeve.com/guava-ratelimiter/
https://www.cnblogs.com/yeyinfu/p/7316972.html
https://www.cnblogs.com/f-zhao/p/7210158.html