我希望使用显式锁定/条件变量来实现这种工作流程(这是一个强制执行这种风格的课程项目。):A是主类,它要求B不时做一些工作。 B有一个工人阶级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和一些Q& A,但仍不知道为什么我会这样做。
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();
}
}
答案 0 :(得分:4)
使用Condition
上的signal()
方法取代notify()
。
虽然您可以在synchronize
个实例上成功Condition
,然后使用传统的wait()
和notify()
方法,但您也可以使用Object
如果您没有使用并发类的扩展功能。
Condition
旨在与等效方法await()
和signal()
及其增强型变体一起使用。