これが本質的に私の問題です:
while (true) {
if (previous 'doWorkAsync' method is not still in flight) {
doWorkAsync() // this returns immediately
}
wait set amount of time
}
いくつかの解決策が思い浮かびます:
doWorkAsync() が完了するまでブロックします。これは、いくつかの理由から私には望ましくありません。(潜在的に) 'wait some set amount of time' 行で実際に必要な時間よりも長く待機することになります (たとえば、doWorkAsync に 5 秒かかり、設定された待機時間が 10 秒の場合、これは 15 秒の結果になります)私が望んでいたものではありません)。もちろん、待機時間を短縮することでこれを説明できますが、どういうわけか、ぎこちなく感じます. また、このスレッドを不必要に結び付けます。このタスクが戻ってくるのを待つ代わりに、このスレッドは他の作業を処理できます。たとえば、次の doWorkAsync() の呼び出しで新しいデータが得られるように構成を更新することができます。
ゲートメカニズムを使用します。頭に浮かぶ最も簡単な実装はブール値であり、doWorkAsync() の呼び出し前に設定され、doWorkAsync() が完了すると設定解除されます。これは本質的に私が今やっていることですが、それがアンチパターンであるかどうかはわかりません??
#2は正しい方法ですか、それともこの問題を解決するためのより良い方法はありますか?
編集:それが役立つ場合、doWorkAsync() は (グアバの) ListenableFuture を返します。
元の質問は 100% 明確ではなかった可能性があります。ここが核心です。指定されたタイムアウト前に非同期リクエストが終了した場合、このコードは常に機能します。ただし、非同期タスクが完了するまでに SET_AMOUNT_OF_TIME + イプシロンがかかる場合、このコードは必要な時間の 2 倍スリープします。これは私が回避しようとしているものです。