我有一个场景,只允许每分钟调用一个方法不超过80次。这实际上是由第三方编写的服务API,如果您调用次数太多,它会“关闭”(忽略调用)其API:
public class WidgetService {
// Can only call this method 80x/min, otherwise it
// it just doesn't do anything
public void doSomething(Fizz fizz);
}
我想编写一个名为
ApiThrottler
的类,其中包含一个boolean canRun()
方法,用于告诉我的Java客户端是否可以调用doSomething(Fizz)
方法。 (当然,它始终可以被调用,但如果我们超过了速率,调用它是没有意义的。)所以,这样的东西将允许我编写以下代码:
// 80x/min
ApiThrottler throttler = new ApiThrottler(80);
WidgetService widgetService = new DefaultWidgetService();
// Massive list of Fizzes
List<Fizz> fizzes = getFizzes();
for(Fizz fizz : fizzes)
if(throttler.canRun())
widgetService.doSomething(fizz);
这并不一定要使用API(ApiThrottler#canRun
),但我需要一个可靠的机制来暂停/休眠,直到可以调用WidgetService#doSomething(Fizz)
。
这让我感觉我们正在进入使用多个线程的领域,这让我感觉我们可以使用某种锁定机制和Java通知(wait()
/notify()
)模型。但是由于没有在这个领域的经验,我无法想出最优雅的解决方案。提前致谢。
doMakeCall
是我将调用widgetService.doSomething(Fizz)
的地方?我需要使用哪些Java类来安排1分钟执行的Caller
?非常感谢到目前为止提供的所有帮助! - IAmYourFaja80 - s.availablePermits()
并避免竞争许可证。 - bowmore