【问题标题】:IllegalStateException with wait(),notify() [duplicate]IllegalStateException with wait(),notify() [重复]
【发布时间】:2016-10-26 23:04:38
【问题描述】:

现在,我正在准备 java ocajp 8 认证,只是查看了一些转储,它说下面的代码会抛出 IllegalStateException;

代码如下`

void waitForSignal() throws Exception{
    Object obj = new Object(); 
    synchronized (Thread.currentThread()) {
        obj.wait(); 
        obj.notify(); 
    } 
}` 

前面的代码就是它提供的全部,没有别的,为什么这里会出现异常,事实上我对多线程知之甚少。 并根据java文档

IllegalStateException :表示方法已在非法或不适当的时间被调用。换言之,Java 环境或 Java 应用程序未处于请求操作的适当状态。

所以我想 wait() 或 notify() 在不适当的时间被调用......如果我是对的,为什么它是非法时间,如果我错了,那么解释为什么会出现异常......

【问题讨论】:

  • 恐怕Java中的多线程不是可以通过反复试验来学习的。 (或者至少需要大量试验。)在这种情况下,问题是您没有obj 的监视器。
  • 顺便说一句,在 Thread 对象上同步是一个非常糟糕的主意™..
  • @biziclop 所以,当我们锁定某个对象时,我们只能在某个对象上调用等待或通知,但这里我们锁定了某个线程对象,所以这就是非法状态异常的原因吗?有错请指正
  • 没错。请参阅 Boola 的答案。
  • 那个 sn-p 创建一个新的Object obj,然后它立即调用obj.wait(),而不使该对象可用于任何其他线程。这有什么意义?

标签: java multithreading wait illegalstateexception notify


【解决方案1】:

除非当前线程拥有该对象的监视器,否则您不能对对象进行 wait()。为此,您必须对其进行同步:

synchronized (obj) {

根据 javadoc :

公共类 IllegalMonitorStateException 扩展 RuntimeException 抛出以指示线程已尝试在对象的监视器上等待或通知其他线程在对象的监视器上等待而不拥有指定的监视器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 2013-05-13
    • 2013-06-08
    相关资源
    最近更新 更多