我有一个使用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()。很难说,因为不清楚您要实现什么。

07-24 19:04
查看更多