导致java.lang.IllegalMonitorStateException的原因

时间:2012-11-26 11:43:01

标签: java multithreading

我正在尝试编写一个想要创建写线程的代码。当我想运行它时,我得到了这个例外。我在这个主题上看到的每篇帖子都没有与我相同的代码。那么任何人都可以帮我解决我的问题吗?

java.lang.IllegalMonitorStateException

堆栈跟踪如下:

    at java.lang.Object.wait(Native Method)
    at java.lang.Object.wait(Object.java:485)
    at prj.McWThread.ReadPacket(McWThread.java:40)
    at prj.McWThread.run(McWThread.java:73)

造成此异常的代码部分是:

public void run()
{
    try{
        while (true)
        {
            this.MyPkt = ReadPacket();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(MyPkt);
       }
       }
}

Readpacket方法:

public MyPacket ReadPacket()
{
    MyPacket m = new MyPacket();
    System.out.println("ReadPacket");
    try {
        while (Buff.isEmpty()) {
            wait();
        }
    }
    catch (InterruptedException ie) {
        ie.printStackTrace();
    }

    if (! Buff.isEmpty()) {
        m = (MyPacket) Buff.remove(0);
        return m;
    } else {
        return m;
    }
}

2 个答案:

答案 0 :(得分:3)

您需要synchonize您的电话等待您的代码。两个选项:

  • 将您的方法声明为同步

    公共同步MyPacket ReadPacket()

  • 在致电synchronized(this)之前使用wait

根据您的设计和其他线程需要执行的工作(如果有),第一个可能不可取。

对于第二个选项,您需要确定是否要将this用作监视器。您可以创建Lock并使用它。

答案 1 :(得分:1)

Object.wait的javadoc。

“当前线程必须拥有此对象的监视器。”和“[throws] IllegalMonitorStateException - 如果当前线程不是对象监视器的所有者。” 您需要在要调用等待的对象上进行同步。

代码应该类似于

synchronize(someobject){
   someobject.wait();
}