2

ロックの取得に5分以上かかる場合は、ロックを取得して通知を送信する必要があるユースケースがあります。私たちはまだ永遠にロックを待つ必要があります。

リエントラントロックを使用していますが、lock.tryLock(5、TimeUnit.Minutes)は、5分後に出力されるため十分ではありません。

私たちが試したオプションは次のとおりです。

while(!lock.tryLock(5, TimeUnit.minutes)) {
    // send notification
}

しかし、これはロックの公平性(ロックが要求された順序)を失う結果になると思います

誰かがそのようなユースケースに直面しましたか?はいの場合、それがどのように解決されたかを説明してください。

あるコンテキストでロックと対応する待機スレッドのメタ情報(ロック取得のために開始されたときなど)を維持する手作業のソリューションを使用したくない場合、別のスレッドがこのコンテキスト全体を継続的にポーリングして、待機している待機スレッドがあるかどうかを確認します5分以上。

4

1 に答える 1

4

ScheduledExecutorServiceを設定します。ロックを取得する前に、5分以内に起動し、Futureを維持するタスクをスケジュールします。ロックを取得したら、Futureをキャンセルします。

ScheduledExceutorService ses;
Future f = ses.schedule(new Runnable(){...}, 5, TimeUnit.Minutes);
lock.lock();
f.cancel();

送信されたタスクが実行される前にロックを取得した場合は、キャンセルする必要があります。

于 2011-10-11T15:05:52.497 に答える