【问题标题】:Java - group threads in one monitorJava - 在一个监视器中分组线程
【发布时间】:2017-11-10 04:50:08
【问题描述】:

我有一个监视器类,其中线程在执行某个方法时应该等到BiPredicate<Integer, Integer> 中的某个值为假。此外,还有一个类将该谓词中的值设置为 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() 的锁变得复杂,就好像我获得了助手对象上的锁一样,我无法释放我对监视器本身的锁。也许我可以为此使用信号量,但这需要动态创建和销毁大量信号量,因为将它们保存在内存中是不可行的。这里最好的方法是什么?

【问题讨论】:

  • "等到某个值为 false" 这是如何工作的?这些值是参数,除非在本地更改,否则它们永远不会改变值。
  • Pred 是BiPredicate<Integer, Integer> 类型的成员变量,我们正在测试它的某个值。一个线程应该等到其他一些线程使用相同的参数调用 setFalse。

标签: java multithreading


【解决方案1】:

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

在此处查看 Javadoc + 示例:

java.util.concurrent.locks.Condition

【讨论】:

    猜你喜欢
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多