我有一个使用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)
有人知道我在做什么错吗?
最佳答案
为了在任何对象上调用wait()
,当前线程必须拥有其监视器。您正在呼叫barrier.wait()
而没有任何synchronized(barrier)
。
但是,您可能打算使用await()
方法(在CyclicBarrier上)而不是wait()
。很难说,因为不清楚您要实现什么。