Guava和RateLimiter限流

复制代码
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来控制代码在一定时间内的执行频率。

相关推荐
老鼠只爱大米18 分钟前
Java 设计模式之适配器模式:系统集成的万能接口
java·设计模式·适配器模式·adapter·java设计模式
一叶飘零_sweeeet18 分钟前
Java+EasyExcel 打造学习平台视频学习时长统计系统
java·报表·easyexcel
Go away, devil20 分钟前
Java-----集合
java·开发语言
JIngJaneIL22 分钟前
旅游|内蒙古景点旅游|基于Springboot+Vue的内蒙古景点旅游管理系统设计与实现(源码+数据库+文档)
java·vue.js·spring boot·论文·旅游·毕设·内蒙古景点旅游
新之助小锅1 小时前
java版连接汇川PLC,发送数据,读取数据,保持重新链接,适用安卓
android·java·python
无糖冰可乐213 小时前
IDEA多java版本切换
java·ide·intellij-idea
合作小小程序员小小店3 小时前
web开发,在线%超市销售%管理系统,基于idea,html,jsp,java,ssh,sql server数据库。
java·前端·sqlserver·ssh·intellij-idea
brucelee1863 小时前
IntelliJ IDEA 设置 Local History 永久保留
java·ide·intellij-idea
Pluto_CSND5 小时前
Java中的静态代理与动态代理(Proxy.newProxyInstance)
java·开发语言
百***46456 小时前
Java进阶-在Ubuntu上部署SpringBoot应用
java·spring boot·ubuntu