gpt4 book ai didi

java - IllegalMonitorStateException 引发显式锁定/条件

转载 作者:行者123 更新时间:2023-11-30 07:38:29 25 4
gpt4 key购买 nike

我想要使用显式锁/条件变量的这种工作流程(这是一个要求这种风格的类(class)项目。):A 是主类,它不时要求 B 做一些工作。 B 有一个 worker 类 C,它不断地向 B 询问新的工作要做和做。 C完成后,会调用A的回调函数通知A工作完成。

但是,当我尝试运行该程序时,当 callback() 试图通知 doit() 函数时,我得到一个 IllegalMonitorStateException。

exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.notifyAll(Native Method)
at Test$A.callback(Test.java:49)
at Test$C.run(Test.java:115)

我查看了 javadoc 和一些关于这个异常的问答,但仍然不知道为什么我会得到这个。

import java.util.*;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.Condition;

public class Test {
public class A
{
private ReentrantLock lock;
private Condition cond;
private boolean bool;
private B b;
public A()
{
this.lock = new ReentrantLock();
this.cond = lock.newCondition();
b = new B(this);
bool = false;
}

public void doit()
{
try {
lock.lock();
b.letgo();
while (!bool) {
System.out.println("A::doit() Block.");
cond.awaitUninterruptibly();
}
System.out.println("A::doit() Done.");
}
finally {
lock.unlock();
}
}

public void callback() {
try {
lock.lock();
bool = true;
cond.notify();
System.out.println("A::callback() done.");
}
finally {
lock.unlock();
}
}
}

public class B
{
private C c;
private ReentrantLock lock;
private Condition cond;
private boolean bool;
public B(A a)
{
this.lock = new ReentrantLock();
this.cond = lock.newCondition();
bool = false;
c = new C(a, this);
c.start();
}

public void letgo()
{
try {
lock.lock();
bool = true;
}
finally {
lock.unlock();
}
}

public void get()
{
try {
lock.lock();
while (!bool) {
cond.awaitUninterruptibly();
}
bool = false;
return;
}
finally {
lock.unlock();
}
}
}

public class C extends Thread
{
private A a;
private B b;

public C(A a, B b)
{
this.a = a;
this.b = b;
}

public void run()
{
while (true) {
b.get();
a.callback();
}
}
}

public static void main(String args[])
{
Test t = new Test();
t.test1();
}

public void test1()
{
A a = new A();
a.doit();
}
}

最佳答案

使用 signal() Condition 上的方法代替 notify()

虽然您可以在Condition 实例上成功同步,然后使用传统的wait()notify() 方法,如果您不使用并发类的扩展功能,您也可以只使用 Object

Condition 旨在与等效方法 await()signal() 及其增强变体一起使用。

关于java - IllegalMonitorStateException 引发显式锁定/条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1760361/

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