2010-12-03 105 views
2

我有如下圖所示,它使用的CyclicBarrier的方法:拋出:IllegalMonitorStateException - 的CyclicBarrier

public void getMessage(Message obj){ 
    CyclicBarrier barrier = new CyclicBarrier(1, new Runnable() { 
     @Override 
     public void run() { 
      synchronized(obj){ 
       System.out.println("--The End --"); 
      } 
     } 
    }); 

    executor.execute(new Runnable() { 
     @Override 
     public void run() { 
      synchronized(obj){ 
       //Perform some routine with message object 
      } 
      try { 
       barrier.wait();//java.lang.IllegalMonitorStateException thrown on this line 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

在這裏我等待程序執行完的時候,我得到:

Exception in thread "pool-2-thread-3" 
java.lang.IllegalMonitorStateException 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:502) 

難道有誰知道我在這裏做錯了什麼?

回答

4

爲了調用wait()任何物體上,當前線程有自己的監視器。您正在撥打barrier.wait()而沒有任何synchronized(barrier)

但是,您可能打算使用await()方法(在CyclicBarrier上)而不是wait()。很難說,因爲你不清楚你想達到什麼目的。

0

是的,你需要獲得屏障的monittor像這樣:

synchhronized(barrier){ 
try { 
    barrier.wait();//java.lang.IllegalMonitorStateException not thrown on this line 
    } catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
} 
0

也許你確實想用await()代替wait()

wait用於阻止某個特定對象上的線程,它是每個對象的一個​​特徵,但是在您的情況下,您正在調用它而沒有對其進行監視。您應該從同一方向調用wait或使用​​方塊通過barrier本身。

0

您需要在使用屏障對象之前獲取鎖定。

問候, Dheeraj喬希

0

的的CyclicBarrier不打算使用,你在這裏做的:參與線程預計致電堵「等待()」方法。

作爲一個附註,計數爲1的CyclicBarrier是完全沒用的:它的目的是允許一定數量的線程(屏障計數)在繼續之前等待對方。 也許你應該考慮改變你的整個算法,特別是如果你不確定併發的東西是如何工作的。

+0

我已經聽取了Jon Skeet和Jack的建議,並按要求完成了。謝謝。 – Bitmap 2010-12-03 14:47:39

相關問題