RateLimiter
类是 Google Guava 库中用于限制操作执行速率的工具。下面是一个简单的例子,演示如何使用 RateLimiter
来限制一个方法的调用速率。
首先,确保你的项目中包含了 Guava 库的依赖。如果你的项目是基于 Maven,可以在 pom.xml
文件中添加以下依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version> <!-- 使用最新版本 -->
</dependency>
接着,下面是使用 RateLimiter
限制方法调用速率的具体代码示例:
import com.google.common.util.concurrent.RateLimiter;
public class RateLimiterExample {
// 创建每秒允许2个许可的 RateLimiter
private static final RateLimiter rateLimiter = RateLimiter.create(2.0);
public static void main(String[] args) {
// 模拟方法调用
for (int i = 0; i < 10; i++) {
methodWithRateLimit();
}
}
private static void methodWithRateLimit() {
// 获取许可,如果没有可用的许可,当前线程会等待
rateLimiter.acquire();
// 模拟执行操作的代码
System.out.println("方法被调用 - 时间: " + System.currentTimeMillis());
}
}
在这个例子中,我们首先创建了一个 RateLimiter
实例,并指定了每秒钟允许的许可数(permitsPerSecond
)。在这个例子中,我们设置为 2.0
,意味着每秒钟最多允许两个操作通过。
在 methodWithRateLimit
方法中,我们通过调用 rateLimiter.acquire()
来从 RateLimiter
获取一个许可。如果当前没有可用的许可,这个方法将阻塞当前线程直到获取许可。这样一来,该方法的执行速率就被限制了。
运行这个程序,你会看到输出结果大概每半秒出现一次,因为 RateLimiter
限制了方法调用的速率。
RateLimiter
还提供了 tryAcquire
方法,它会立即返回一个布尔值,无论许可是否可用。这允许你在许可不可用时,不会阻塞线程,而是执行其他的逻辑。