私は基本的にこのようなLock
とCondition
をラップ私のコードで待機/通知メカニズムがあります。Javaで信号の後に待たれる可能性のない状態を待つ方法は?
someFunction();
myCond.doWait();
それがいる可能性がある:私の問題は、私はこのような何かを行う場合ということです
class ConditionWithTimeout { // timeout part omitted
private Lock lock = new ReentrantLock();
private Condition cond = lock.newCondition();
public void doWait() throws InterruptedException {
lock.lock();
cond.await();
lock.unlock();
}
public void doNotify() {
lock.lock();
cond.signalAll();
lock.unlock();
}
}
をsomeFunction
がdoNotify
を呼び出した場合myCondition
myCondition
がタイムアウトするまでsomeFunction
にdoWait
が実行される可能性があります。このコードがexecの次の行にジャンプする前に実行される可能性があります。 ute myCond.doWait
。
私はpreWaitFn
を追加することによって、その周りに働いた:
class ConditionWithTimeout {
private Lock lock = new ReentrantLock();
private Condition cond = lock.newCondition();
private Executor hookExecutor = Executors.newSingleThreadExecutor();
public void doWait() throws InterruptedException {
doWait(() -> {
});
}
public void doWait(Runnable preWaitFn) throws InterruptedException {
lock.lock();
hookExecutor.execute(preWaitFn);
cond.await();
lock.unlock();
}
public void doNotify() {
lock.lock();
cond.signalAll();
lock.unlock();
}
}
をし、それが動作するようになりましたが、cond.await
が呼び出される前にdoNotify
が呼び出されることは可能ですので、これは私にはコードのにおいのように思えます。
私の質問は、そのような状況ではどのようなベストプラクティスですか? someFunction
の作業が終了するまでブロックする必要がありますが、このようなコーナーケースは避けたいと思います。
私のケースでは 'CountDownLatch'が働いています(私の質問で詳しく述べられていない理由で)が、私は心に留めておきます! –