2009-11-19 46 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