更新:我使用的是 Java 1.6.34,没有机会升级到 Java 7。
我有一个场景,我每分钟只能调用一个方法 80 次。它实际上是由第 3 方编写的服务 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()
) 模型。但是在这个领域没有经验,我似乎无法理解最优雅的解决方案。提前致谢。