4

これが本質的に私の問題です:

while (true) {
  if (previous 'doWorkAsync' method is not still in flight) {
    doWorkAsync()  // this returns immediately
  }
  wait set amount of time
}

いくつかの解決策が思い浮かびます:

  1. doWorkAsync() が完了するまでブロックします。これは、いくつかの理由から私には望ましくありません。(潜在的に) 'wait some set amount of time' 行で実際に必要な時間よりも長く待機することになります (たとえば、doWorkAsync に 5 秒かかり、設定された待機時間が 10 秒の場合、これは 15 秒の結果になります)私が望んでいたものではありません)。もちろん、待機時間を短縮することでこれを説明できますが、どういうわけか、ぎこちなく感じます. また、このスレッドを不必要に結び付けます。このタスクが戻ってくるのを待つ代わりに、このスレッドは他の作業を処理できます。たとえば、次の doWorkAsync() の呼び出しで新しいデータが得られるように構成を更新することができます。

  2. ゲートメカニズムを使用します。頭に浮かぶ最も簡単な実装はブール値であり、doWorkAsync() の呼び出し前に設定され、doWorkAsync() が完了すると設定解除されます。これは本質的に私が今やっていることですが、それがアンチパターンであるかどうかはわかりません??

#2は正しい方法ですか、それともこの問題を解決するためのより良い方法はありますか?

編集:それが役立つ場合、doWorkAsync() は (グアバの) ListenableFuture を返します。

元の質問は 100% 明確ではなかった可能性があります。ここが核心です。指定されたタイムアウト前に非同期リクエストが終了した場合、このコードは常に機能します。ただし、非同期タスクが完了するまでに SET_AMOUNT_OF_TIME + イプシロンがかかる場合、このコードは必要な時間の 2 倍スリープします。これは私が回避しようとしているものです。

4

2 に答える 2

0

あなたが探しているのはThe Reactor Patternだと思います。

これらを同時に実行したくない理由はありますか? それらを連鎖させたい場合は、先物を使用できます。Akkaには、コンポーザブル フューチャーとマッピング可能なフューチャーがあります。

于 2013-04-07T01:51:01.170 に答える