使用Guava RateLimiter类调用限制方法

我试图限制每秒调用一个方法的次数。 我尝试使用Guava RateLimiter实现这一目标。

RateLimiter rateLimiter = RateLimiter.create(1.0);//Max 1 call per sec rateLimiter.acquire(); performOperation();//The method whose calls are to be throttled. 

然而,呼叫的方法不限于每秒1个,而是连续的。

使用Thread.sleep()可以实现限制,但我希望使用Guava而不是sleep()。

我想知道使用Guava RateLimiter实现方法调用trottling的正确方法。 我已经检查了RateLimiter的文档,并试图使用相同的但无法达到预期的结果。

您需要在每次调用时在相同的RateLimiter上调用acquire() ,例如通过在performOperation()

 public class RateLimiterTest { public static void main(String[] args) { RateLimiter limiter = RateLimiter.create(1.0); for (int i = 0; i < 10; i++) { performOperation(limiter); } } private static void performOperation(RateLimiter limiter) { limiter.acquire(); System.out.println(new Date() + ": Beep"); } } 

结果是

2015年5月7日星期五19:00:10 BST:哔哔
2015年5月7日星期五19:00:11 BST:哔哔
Fri Aug 07 19:00:12 BST 2015:Beep
2015年5月7日星期五19:00:13 BST:哔哔
2015年5月7日星期五19:00:14 BST:哔哔
2015年5月7日星期五19:00:15 BST:哔哔
Fri Aug 07 19:00:16 BST 2015:Beep
2015年5月7日星期五19:00:17 BST:哔哔
2015年5月7日星期五19:00:18 BST:哔哔
Fri Aug 07 19:00:19 BST 2015:Beep