3

BlockingQueue 内のすべての未処理の作業が処理されるまでブロックするメソッドを提供する必要があります。

私はこれをカウントセマフォで処理できると考えていました.0から始まり、アイテムがキューに追加されると減少し、完了すると増加します。finish() は、セマフォを取得し、再び解放して終了します。

おそらくreducePermits()を呼び出すことができます。許可カウントがすでに < 0 の場合、これは機能しますか? 保護されているため、機能させるには Semaphore クラスを拡張する必要があります。

2 番目に良いアイデアは、キューの内容をループでチェックし、チェックの間に 100 ミリ秒ほどスリープすることです。それは動作しますが、ぎこちないようです。

これは理にかなっていますか?誰かが提案するより簡単でクリーンな方法を持っていますか?

ティア - ティム。

public MyClass {
  public class MySemaphore extends Semaphore {
    public void seize() {
      reducePermits(1);
    }
  }
  private MySemaphore allDone = new MySemaphore();
  void startSomething() {
    allDone.seize();
  }
  void finishSomething() {
    allDone.release();
  }
  void finish() {
    allDone.acquire();
    allDone.release();
  }
}
4

1 に答える 1

2

を呼び出してキューをdrainTo(collection)空にし、すべてのアイテムに対して自分で処理を呼び出し(おそらくFuturesなどを介して)、最後の処理を呼び出すことができます。

于 2012-05-10T01:25:40.700 に答える