当前位置: 首页 > article >正文

RateLimiter超时

案例

public static void main(String[] args) {
    // 创建一个RateLimiter,速率为每秒1个许可
    RateLimiter rateLimiter = RateLimiter.create(1.0);

    // 预先消耗所有的初始许可
    rateLimiter.acquire(1);

    // 创建并启动多个线程来模拟高并发
    for (int i = 0; i < 5; i++) {
        final int threadNumber = i;
        new Thread(() -> {
            long start = System.currentTimeMillis();
            boolean acquired = rateLimiter.tryAcquire(1, 1000, TimeUnit.MILLISECONDS);
            long end = System.currentTimeMillis();
            long diff = end - start;
            if (acquired) {
                System.out.println("Thread " + threadNumber + " acquired permit: " + diff + " ms");
            } else {
                System.out.println("Thread " + threadNumber + " could not acquire permit (timeout): " + diff + " ms");
            }
        }).start();
    }
}

输出结果

Thread 4 could not acquire permit (timeout): 0 ms
Thread 1 could not acquire permit (timeout): 0 ms
Thread 2 could not acquire permit (timeout): 0 ms
Thread 3 could not acquire permit (timeout): 0 ms
Thread 0 acquired permit: 999 ms

解释

官方注解

Acquires the given number of permits from this RateLimiter if it can be obtained without exceeding the specified timeout, or returns false immediately (without waiting) if the permits would not have been granted before the timeout expired.
获取指定数量的许可,如果可以在不超过指定超时时间的情况下获得许可,否则立即返回 false(不等待),如果许可在超时之前不能被授予。

在单线程示例中,每次调用大约等待一秒钟就能获得许可,因此不会抛出任何异常。这是你的代码中发生的情况:

  1. 第一次调用知道可以立即获得许可,所以它立即获得许可。
  2. 在第一次调用完成后,第二次调用知道如果等待大约 1 秒钟可以获得许可,所以它等待大约 1 秒并获得许可。
  3. 在第二次调用完成后,第三次调用知道如果等待大约 1 秒钟可以获得许可,所以它等待大约 1 秒并获得许可。
  4. 在第三次调用完成后,第四次调用知道如果等待大约 1 秒钟可以获得许可,所以它等待大约 1 秒并获得许可。
  5. 程序结束。

现在,尝试在多线程示例中使用这个,你将开始看到一些失败和一些成功。因为它们都想同时获得许可。

  1. 第一个获得许可的线程很高兴。
  2. 然后第二个线程知道如果等待大约 1 秒钟,它可以获得许可,所以它等待直到获得许可。
  3. 第三个和第四个线程看到队列中已经有两个调用,知道它们必须等待 2 秒钟才能获得许可。所以它们放弃了,因为你设置的 1 秒超时已经超过了 2 秒。

在这个多线程示例中,你会看到多个线程同时尝试获取许可时,会出现一些线程成功获取许可,而其他线程因超时而失败。

总结

  1. tryAcquire的超时参数,是在预期超时之前能够获取到令牌才会阻塞等待,否则会理解返回获取失败

http://www.kler.cn/a/283637.html

相关文章:

  • 鸿蒙自定义UI组件导出使用
  • 软件测试面试2024最新热点问题
  • 知识库管理系统:企业数字化转型的加速器
  • AI 扩展开发者思维方式:以 SQL 查询优化为例
  • vue2或vue3的name属性有什么作用?
  • react 中 FC 模块作用
  • Memcached stats items 命令
  • JVM运行时数据区详解
  • 全球视角下的AI应用:国内外技术与实践的比较分析
  • 了解一下 CSS 的了解font-variant-alternates属性
  • TCP/IP和SNMP
  • matlab峰值检测
  • HTML静态网页成品作业(HTML+CSS+JS)——迪士尼公主介绍(6个页面)
  • sql server导入mysql,使用python多线程
  • 从blob 下载zip文件到本地并解压
  • 罗德与施瓦茨RS、UPV 音频分析仪 250KHZ 双通道分析仪UPL
  • 【面试经验】字节产品经理二面面经
  • MySQL空间函数ST_Distance_Sphere()的使用
  • Mysql-redo logs,binlog以及undo logs的作用及区别
  • 对mozjpeg中的函数名进行替换
  • 详解Spring AOP
  • 简单的Tcp服务器
  • 【香橙派系列教程】(十六) 语音模块与阿里云结合
  • Kafka日志及常见问题
  • x-cmd mod | x scoop - Windows 开源包管理工具
  • Java、python、php版 美发美甲预约服务平台 美容院管理系统(源码、调试、LW、开题、PPT)