gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:30:23 24 4
gpt4 key购买 nike

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

最佳答案

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

请参阅此处的 Javadoc + 示例:

java.util.concurrent.locks.Condition

关于Java - 将线程分组在一个监视器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47211206/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com