0

これが私の問題です:

  1. イベントの受信後に実行される長時間の計算 (「タスク」と呼びましょう) があります。
  2. イベントは、処理するデータがまだあることを示しています。イベントには、タスクのデータを安全に処理できる場所のインデックスが含まれています。
  3. 新しいイベントを取得すると、最終的に処理する必要があるデータが増えます。
  4. 新しいイベントを取得したときに、既存のタスクをキャンセルしたくありませんが、終了させて​​から次のタスクを開始します。
  5. タスク中に複数のイベントを取得した場合、次のタスクは最新のイベントのみを処理し、それ以前のすべてのイベントを破棄する必要があります。
  6. 一度に 1 つのタスクを処理するのに十分なリソースしかありません。

Executors.newSingleThreadExecutor()上記の条件を実装するために使用できるの修正版はありますか? BlockingQueue または AtomicReferences を使用して洗練された処理を行うことはできますか? 上記で説明したことを行う簡単な方法はありますか?

4

2 に答える 2

0

ThreadPoolExecutor の拡張機能である Java ScheduledThreadPoolExecutor を使用してみてください。スレッド プール サイズを 1 に制限して、キューから 1 つのタスクのみが選択されるようにすることができます。唯一の問題は、ScheduledThreadPoolExecutor が内部で無限のキューである DelayQueue の実装を使用しているが、最後のタスク/イベントのみを選択する必要があることです。

ScheduledThreadPoolExecutor クラスを拡張し、現在の ScheduledThreadPoolExecutor 実装にバインドされている DelayedWorkQueue とは異なるキューを使用する必要がある場合があります。DelayedWorkQueue は、舞台裏で DelayQueue を使用している BlockingQueue 実装にすぎないことに注意してください。すべての schedule* メソッドをオーバーライドし、タスクの独自の境界を実装します。

于 2013-05-04T00:53:42.063 に答える