Guava和RateLimiter限流
2023-12-22 22:44:49
public class RateLimiterDemo {
static RateLimiter limiter = RateLimiter.create(2);
public static class Task implements Runnable{
@Override
public void run() {
System.out.println(System.currentTimeMillis());
}
}
public static void main(String[] args) {
for(int i=0;i<50;i++){
//limiter.acquire();
if(!limiter.tryAcquire()){
continue;
}
new Thread(new Task()).start();
}
}
}
当请求成功时,tryAcquire()方法返回true,否则返回false,
该方法不会阻塞。limiter仅支持1秒两次调用,也就是每
500毫秒可用产生一个令牌,显然由于for循环本身的效率高,
完全可用在500毫秒内完成,因此本段代码最终只产生一个输出,
其余请求全部被丢弃?
意思是说 500毫秒内就能执行50次循环,并且只要一次tryAcquire
成功,后续都不会成功?所以只输出一次?
这段代码使用了Guava库中的RateLimiter
来限制在特定时间内的请求速率。具体来说,limiter
被配置为每秒产生2个令牌,也就是说每500毫秒就会有一个令牌可用。
在main
方法中的for
循环中,你试图启动50个线程,并在每次迭代中尝试获取limiter
的令牌。如果tryAcquire
成功(即在500毫秒内成功获取到令牌),就会创建一个新的线程并输出当前的系统时间(毫秒级别)。
由于RateLimiter
的速率限制为每秒2次,而for
循环很快就能执行完,所以在500毫秒内只有一个tryAcquire
成功,因此只有一个线程被创建并输出了系统时间。其他的tryAcquire
调用因为在500毫秒内无法获取到令牌而失败,所以没有额外的线程被创建。
因此,最终的输出可能只有一次系统时间输出,而其他的请求都因为速率限制而被丢弃。这个例子展示了如何使用RateLimiter
来控制代码在一定时间内的执行频率。
文章来源:https://blog.csdn.net/wcg_jishuo/article/details/135162025
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!