更新:Java 1.6.34を使用していますが、Java7にアップグレードする機会はありません。
1分間に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);
}
Javaクライアントにメソッドを呼び出すことができるかどうかを通知ApiThrottler
するメソッドを持つクラスを作成したいと思います。(もちろん、いつでも呼び出すことができますが、レートを超えた場合は呼び出す意味がありません。)boolean canRun()
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()