首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IllegalMonitorStateException - CyclicBarrier

IllegalMonitorStateException - CyclicBarrier
EN

Stack Overflow用户
提问于 2010-12-03 21:49:41
回答 5查看 1.7K关注 0票数 2

我有一个使用CyclicBarrier的方法,如下所示:

代码语言:javascript
复制
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();
            }
        }
    });
}

在等待例程完成执行时,我得到:

代码语言:javascript
复制
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)

有人知道我做错了什么吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-12-03 21:53:27

为了在任何对象上调用wait(),当前线程必须拥有自己的监视器。您正在调用没有任何synchronized(barrier)barrier.wait()

但是,您可能打算使用await()方法(在CyclicBarrier上),而不是wait()。很难说,因为还不清楚你想要实现什么。

票数 7
EN

Stack Overflow用户

发布于 2010-12-03 21:52:57

是的,你需要像这样获取栅栏的监控器:

代码语言:javascript
复制
synchhronized(barrier){
try {
     barrier.wait();//java.lang.IllegalMonitorStateException not thrown on this line
    } catch (InterruptedException e) {
    e.printStackTrace();
}
}
票数 0
EN

Stack Overflow用户

发布于 2010-12-03 21:54:41

也许您确实想使用await()而不是wait()

wait用于阻塞特定对象上的线程,它是每个对象的一个特性,但在您的示例中,您是在调用它而不使用它的监视器。您应该从同一对象内部调用wait,或者在barrier本身上使用synchronized块。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4346152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档