我正在尝试编写一个想要创建写线程的代码。当我想运行它时,我得到了这个例外。我在这个主题上看到的每篇帖子都没有与我相同的代码。那么任何人都可以帮我解决我的问题吗?
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;
}
}
答案 0 :(得分:3)
您需要synchonize
您的电话等待您的代码。两个选项:
将您的方法声明为同步
公共同步MyPacket ReadPacket()
在致电synchronized(this)
之前使用wait
。
根据您的设计和其他线程需要执行的工作(如果有),第一个可能不可取。
对于第二个选项,您需要确定是否要将this
用作监视器。您可以创建Lock
并使用它。
答案 1 :(得分:1)
Object.wait的javadoc。
“当前线程必须拥有此对象的监视器。”和“[throws] IllegalMonitorStateException - 如果当前线程不是对象监视器的所有者。” 您需要在要调用等待的对象上进行同步。
代码应该类似于
synchronize(someobject){
someobject.wait();
}