RateLimiter超时

2024-08-31 04:36
文章标签 超时 ratelimiter

本文主要是介绍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的超时参数,是在预期超时之前能够获取到令牌才会阻塞等待,否则会理解返回获取失败

这篇关于RateLimiter超时的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1122906

相关文章

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Python处理函数调用超时的四种方法

《Python处理函数调用超时的四种方法》在实际开发过程中,我们可能会遇到一些场景,需要对函数的执行时间进行限制,例如,当一个函数执行时间过长时,可能会导致程序卡顿、资源占用过高,因此,在某些情况下,... 目录前言func-timeout1. 安装 func-timeout2. 基本用法自定义进程subp

java实现延迟/超时/定时问题

《java实现延迟/超时/定时问题》:本文主要介绍java实现延迟/超时/定时问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java实现延迟/超时/定时java 每间隔5秒执行一次,一共执行5次然后结束scheduleAtFixedRate 和 schedu

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

Java中实现订单超时自动取消功能(最新推荐)

《Java中实现订单超时自动取消功能(最新推荐)》本文介绍了Java中实现订单超时自动取消功能的几种方法,包括定时任务、JDK延迟队列、Redis过期监听、Redisson分布式延迟队列、Rocket... 目录1、定时任务2、JDK延迟队列 DelayQueue(1)定义实现Delayed接口的实体类 (

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

Java CompletableFuture如何实现超时功能

《JavaCompletableFuture如何实现超时功能》:本文主要介绍实现超时功能的基本思路以及CompletableFuture(之后简称CF)是如何通过代码实现超时功能的,需要的... 目录基本思路CompletableFuture 的实现1. 基本实现流程2. 静态条件分析3. 内存泄露 bug

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Springboot使用RabbitMQ实现关闭超时订单(示例详解)

《Springboot使用RabbitMQ实现关闭超时订单(示例详解)》介绍了如何在SpringBoot项目中使用RabbitMQ实现订单的延时处理和超时关闭,通过配置RabbitMQ的交换机、队列和... 目录1.maven中引入rabbitmq的依赖:2.application.yml中进行rabbit