2017-11-09 5 views
0

特定のメソッドを実行しているスレッドがBiPredicate<Integer, Integer>で特定の値がfalseになるまで待機するモニタクラスがあります。また、その述部の値をfalseに設定するクラスもあります。1つのモニタでJavaグループスレッド

class Monitor { 
    synchronized void doSomething(int x, int y) { 
     //... 
     while(pred.test(x, y)) { 
      wait(); 
     } 
     //... 
    } 
    synchronized void setFalse(int a, int b) { 
     pred.and((x, y) -> x != a && y != b); 
     notifyAll(); 
    } 
} 

特にab待つだけのスレッドが通知されるようにそれを作るための方法はありますし、すべてのスレッドがモニターに待機していない:それは次のようになりますか?私が考えていた解決策の1つは、IntegersのペアをキーとしたヘルパーオブジェクトのHashMapを作成し、doSomething()がそれらのオブジェクトを待つことでした。そしてsetFalse()はマップに与えられたペアが含まれているかどうかをチェックし、それ。しかし、この方法はdoSomething()のロックを複雑にします。ヘルパーオブジェクトのロックを取得したように、自分自身のロックを解除することはできません。たぶん私はセマフォを使うことができるかもしれませんが、セマフォをたくさん作成して破壊する必要があります。ここで最善のアプローチは何ですか?

+0

この作業を行う方法 "を一定の値がfalseになるまで待って"?これらの値はパラメータであり、ローカルで変更されない限り値を変更することはありません。 – markspace

+0

Predは 'BiPredicate '型のメンバ変数であり、特定の値に対してテストしています。スレッドは、他のスレッドが同じ引数でsetFalseを呼び出すまで待つことになっています。 – Joald

答えて

関連する問題