Java - 在一个监视器中组合线程

时间:2017-11-09 20:43:47

标签: java multithreading

我有一个监控类,其中执行某个方法时的线程应该等到BiPredicate<Integer, Integer>中某个值为false。此外,还有一个类将该谓词中的值设置为false。它看起来像这样:

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的线程,而不是所有线程都在监视器上等待?我想到的一个解决方案是创建一个辅助对象的HashMap,其中整数对作为键,doSomething()将等待这些对象,然后setFalse()将检查Map是否包含给定对并且仅通知那些等待与之对应的辅助对象。但是这种方法使doSomething()的锁变得复杂,好像我获得了对辅助对象的锁定,我无法释放我对Monitor本身的锁定。也许我可以使用信号量,但这需要动态创建和销毁大量的信号量,因为将它们保存在内存中是不可行的。这里最好的方法是什么?

1 个答案:

答案 0 :(得分:2)

您可以使用Condition中的java.util.concurrent.locks

请参阅Javadoc +示例:

java.util.concurrent.locks.Condition