BlockingQueue内のすべての未処理作業が処理されるまでブロックするメソッドを提供する必要があります。Java無制限カウント・セマフォ?
私は、0で始まるカウントされたセマフォでこれを処理できると思っていました。アイテムがキューに追加され、それらが完了すると増分するにつれ減少します。 finish()はセマフォを取得し、再び解放して終了します。
おそらくreducePermits()を呼び出すことができます。許可カウントがすでに<になっていれば、これは機能しますか?保護されているので、セマフォークラスを拡張して機能させる必要があります。
私の次善のアイデアは、ループ内のキューの内容をチェックし、チェックの間に100msほどスリープすることです。それは動作しますが、クルージュのようです。
これは意味がありますか?誰もが簡単で清潔な方法を提案していますか?
TIA、 - Tim。
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();
}
}
解決しようとしている問題はわかりませんが、CompletionServiceが機能するかどうかを確認してください(http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent /CompletionService.html)。 –
yup、あるいは何をしようとしているのかに応じて、 'CountdownLatch' http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/CountDownLatch.htmlを参照してください。 (ユースケースについてさらに説明しますか?) – andersoj
ありがとう、私もそれらのことを考えましたが、彼らは私のためにはうまくいきませんでした。 CompletionService and Future彼らは出口の別々のスレッドを扱うように。私は終了しない作業のバッチを処理する単一のスレッドを持っています。 CountdownLatchは、カウントダウンしている既知の数の要素を想定しています。私は、任意の数のアイテムを待つ必要があり、すべてが完了したらアンブックする必要があります。 –
tbroberg