我有一个使用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)有人知道我做错了什么吗?
发布于 2010-12-03 21:53:27
为了在任何对象上调用wait(),当前线程必须拥有自己的监视器。您正在调用没有任何synchronized(barrier)的barrier.wait()。
但是,您可能打算使用await()方法(在CyclicBarrier上),而不是wait()。很难说,因为还不清楚你想要实现什么。
发布于 2010-12-03 21:52:57
是的,你需要像这样获取栅栏的监控器:
synchhronized(barrier){
try {
barrier.wait();//java.lang.IllegalMonitorStateException not thrown on this line
} catch (InterruptedException e) {
e.printStackTrace();
}
}发布于 2010-12-03 21:54:41
也许您确实想使用await()而不是wait()
wait用于阻塞特定对象上的线程,它是每个对象的一个特性,但在您的示例中,您是在调用它而不使用它的监视器。您应该从同一对象内部调用wait,或者在barrier本身上使用synchronized块。
https://stackoverflow.com/questions/4346152
复制相似问题