1

我正在尝试编写一个想要创建写线程的代码。当我想运行它时,我得到了这个异常。我看到的关于这个主题的每一篇文章都没有和我一样的代码。那么有人可以帮我解决我的问题吗?

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);
       }
       }
}

读包方法:

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;
    }
}
4

2 回答 2

3

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

  • 将您的方法声明为同步

    公共同步 MyPacket ReadPacket()

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

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

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

于 2012-11-26T11:51:27.493 回答
1

Object.wait的 javadoc 。

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

代码应该看起来像

synchronize(someobject){
   someobject.wait();
}
于 2012-11-26T11:48:10.487 回答