限制方法使用Guava RateLimiter类调用

suj*_*ith 13 java throttling guava

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

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

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

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

我想知道使用Guava RateLimiter实现方法调用限制的正确方法.我已经检查了RateLimiter的文档并尝试使用相同但无法实现所需的结果.

Jen*_*ann 21

您需要在每次调用时调用acquire()相同的内容RateLimiter,例如通过以下方式使其可用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");
    }
}
Run Code Online (Sandbox Code Playgroud)

结果是

Fri Aug 07 19:00:10 BST 2015:Beep
Fri Aug 07 19:00:11 BST 2015:Beep
Fri Aug 07 19:00:12 BST 2015:Beep
Fri Aug 07 07:00:13 BST 2015:Beep
Fri Aug 07 19:00:14 BST 2015:Beep
Fri Aug 07 19:00:15 BST 2015:Beep
Fri Aug 07 19:00:16 BST 2015:Beep
Fri Aug 07 19:00:17 BST 2015:Beep
Fri Aug 07 19 :00:18 BST 2015:Beep
Fri Aug 07 07:00:19 BST 2015:Beep

  • 嗨sujith,`acquire()`的[文档](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/util/concurrent/RateLimiter.html#acquire())状态是块,所以它们都将以指定的速率执行(同样,如果不是这样的话,在我的例子中你不会看到10行输出) (3认同)
  • `rateLimiter.acquire()`将等待适当的时间,直到另一个操作完成为止. (2认同)