我试图限制每秒调用一个方法的次数。
我尝试使用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实现方法调用运行的正确方法。
我检查了RateLimiter的文档,并尝试使用相同的文档,但无法达到预期的效果。

最佳答案

您需要在每次调用时在相同的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");
    }
}

结果是

09-11 03:53