2009-11-19 51 views
2

我想要使用显式锁定/条件变量(这是一个授权此风格的课程项目)具有此类工作流程:A是主类,它要求B做一些工作时。 B有一个工人阶级C,他不断向B询问有关新工作的事情。 C完成后,它将调用A的回调函数来通知A该作业已完成。IllegalMonitorStateException引发显式锁定/条件

但是当我尝试运行该程序时,当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和有关此异常的一些问答& 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

哪一行是'at Test $ A.callback(Test.java:49)' – 2009-11-19 01:37:54

回答

4

代替notify()使用上Conditionsignal()方法。

虽然可以成功synchronizeCondition实例,然后使用传统的wait()notify()方法,你可能也只是如果你不使用并发类的扩展功能使用Object

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

+0

我刚找到它......感谢您的快速回答! – CyberSnoopy 2009-11-19 01:44:05