多くのスレッドから要求された書き込みアクションを収集し、それらをグループとして、たとえば 1 秒に 1 回フラッシュするバッファを Java で構築しています。waitForFlush
次のフラッシュイベントが完了するまで、それをブロックして呼び出すメソッドと呼ばれるメソッドを提供したいと思います。その間、別のスタンドアロン スレッドがフラッシュし、ループ内でスリープします。だから私は基本的に、多くのスレッドが特定の時点でブロックし、それらをすべて同時に解放できるようにする同時実行構造またはパターンを探しています. . これまでに思いついたのは、次のように、wait/notifyAll です。
public class Buffer {
private volatile long lastFlushTime = System.currentTimeMillis();
private final Object flushMonitor = new Object();
public void waitForFlush() {
long entryTime = System.currentTimeMillis();
synchronized(flushMonitor) {
while(lastFlushTime <= entryTime) {
flushMonitor.wait();
}
}
}
public void flush() {
// do flush stuff here
synchronized(flushMonitor) {
lastFlushTime = System.currentTimeMillis();
flushMonitor.notifyAll();
}
}
}
これは実際には問題なく機能すると思いますが、同期ブロックはwaitForNotify()
まだ不完全に感じられます。理想的には、このユースケースでは、関連付けられたオブジェクトを同期せずに呼び出すことができ、ブロックされたすべてのスレッドが、同期されたブロックを 1 つずつ終了するのではなく、呼び出されwait()
た瞬間に解放されます。notifyAll()
1。
したがって、一般に、可変数のスレッドをブロックして同時に解放するより良い方法はありますか?