作者丨会点代码的大叔
来源丨会点代码的大叔(CodeDaShu)
public class CounterTest {
public static void main(String[] args) {
long timeStamp = System.currentTimeMillis();
int timeCount = 1;
int reqCount = 0; //单位时间内的请求数量
int reqCountTotal = 0; //请求总数
final int limit = 10; // 时间窗口内最大请求数
final long interval = 1000; // 时间窗口ms
for(;;){
// 当前时间
long now = System.currentTimeMillis();
if (now < timeStamp + interval) {
//在之间窗口内
reqCount ++ ;
//没有超过单位时间的请求数量
if(reqCount < limit){
reqCountTotal ++ ;
System.out.println(timeCount + " : " + reqCountTotal);
}
}else {
//下一个时间窗口
timeStamp = now;
reqCount = 0 ;
timeCount ++ ;
}
}
}
}
import java.util.concurrent.Executors;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.common.util.concurrent.RateLimiter;
public class RateLimiterTest {
public static void main(String[] args) {
testRateLimiter();
}
public static void testRateLimiter() {
ListeningExecutorService executorService = MoreExecutors
.listeningDecorator(Executors.newFixedThreadPool(5));
RateLimiter limiter = RateLimiter.create(4); // 每秒不超过4个任务被提交
int num = 0 ;
for (;;) {
limiter.acquire(); // 请求RateLimiter, 超过permits会被阻塞
num ++ ;
executorService.submit(new Task("is "+ num));
}
}
}
class Task implements Runnable{
String str;
public Task(String str){
this.str = str;
}
@Override
public void run() {
System.out.println("Task call execute.." + str);
}
}
联系客服