DelayQueueの実際の使用法[終了]


18

DelayQueueの実際の使用法は何ですか?解決するために設計された一般的な問題は何ですか?

回答:


8

最近、レート制限に遅延キューを使用しました。

1秒あたりXイベントの制限の場合、各イベントを1秒の遅延で遅延キューに入れます。

delayQueueにXイベントがある場合、キューからtake()(少なくとも1つの有効期限が切れるまでブロックします)。そうすれば、長期的な制限を超えることなく、短期間のバーストを許可できます。


10

このクラスは、複数の遅延イベントを適切な順序で処理するスレッドに最適です。

たとえば、100個のライトが点滅しているディスプレイがあり、すべてのライトが無関係な速度で点滅しているとします。ライトごとにスレッドを作成することも、このクラスを使用してすべてのライトを1つのスレッドで調整することもできます。これは次のように動作します:

  • Lightフラッシュレートのあるクラスがあります
  • Delayedたとえば、光を指すインターフェイスの実装を作成しますLightFlash
  • を作成してDelayQueueLightFlashライトごとに新しいライトを追加します。ライトのフラッシュレートに適した遅延を設定します
  • ループ:

DelayQueueは、処理する次のイベントを取得します。

私が考えることができる2つの実世界の例:

  • 特定の時間指定アクション(各接続での接続pingなど)を実行する必要がある(非マルチスレッド)サーバー。
  • setInterval()およびsetTimeout()で作成された任意の数の時間指定イベントを処理する必要がある、javascript対応ブラウザーの実装。ああ、アニメーションGIF。

DelayQueueはおそらく優先キューとして実装されます。これは一般にヒープとして実装するのが最も良いです。


3

主な用途は、Timerクラスのようなタスクタイマーです。

遅延をシステムクロックから独立させることができる場合(これは確信できますが、確かではありません)、「5ティックがXに移動した後」のようなゲームイベントに使用できます


2

遅延は、キュー自体ではなく、キューに入る要素に関連付けられていることに注意してください。キューに入るオブジェクトには、遅延がゼロになるものもあれば、はるかに長い遅延を持つものもあります。

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Delayed.html

これを念頭に置いて、いくつかのユースケースを考えることができます。ただし、メッセージングフローに関してはおそらく脆弱であり、少しコードの匂いがするでしょう。特定の状況を除いて、それらすべての代替を使用します。

1)制御フロー-注文の処理には60秒かかることがわかっているため、オブジェクトが少なくとも60秒間存在するまで、キューから次の注文を読み取らないでください。

2)メッセージフロー-2つまたは3つの外部サービスにリクエストを送信し、ジョブの最初のバッチが少なくとも完了する可能性があることがわかったら、N秒後に注文を処理するために次のタスクをリリースする非同期システム。

3)メッセージのバッチ処理-特定の種類の注文はバースト的である可能性があるため、最後のN秒間に受信した注文を処理しないようにして、同様の注文がすぐに来るかどうかを確認します。

4)メッセージの優先順位-異なるメッセージまたは異なる顧客は、低遅延またはゼロ遅延でわずかに高いサービス品質を得ることができます。


1

場合によっては、キューに配置するオブジェクトは、デキューの準備が整う前に、一定時間そのキューに存在する必要があります。これは、BlockingQueueインターフェースを実装するjava.util.concurrent.DelayQueueクラスを使用する場所です。DelayQueueでは、指定された時間キューオブジェクトがキューに常駐する必要があります。

実際の使用例については、devxサイトのMinding the Queueの記事をご覧ください。

...これを説明するために私が考えた現実世界の例(お腹がすいたかもしれません)にはマフィンが含まれます。まあ、マフィンオブジェクト(私たちはJavaを話しているので、コーヒーしゃれを意図していません)。Muffinオブジェクトを配置するDelayQueueがあるとします...本質的に、getDelayメソッドは、オブジェクトがDelayQueueに保持されるまでの時間を示します。このメソッドによって返される数値がゼロまたはゼロより小さくなると、オブジェクトは準備ができ(この例ではベイク処理され)、デキューできるようになります...

完全に調理されていないマフィンを食べたくないので、推奨される調理時間の間、マフィンをDelayQueueに配置します...


1
私はそれが何をするかを理解しますが、どのような共通の問題、それを解決するために設計された、私はユースケースを探していません(S)
エランメダン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.