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

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

2 に答える 2

3

synchonizeあなたはあなたのコードで待つためにあなたの呼び出しをする必要があります。2つのオプション:

  • メソッドを同期済みとして宣言します

    public syncronized MyPacket ReadPacket()

  • synchronized(this)を呼び出す前に使用してくださいwait

最初の方法は、設計や他のスレッドが実行する必要のある作業(ある場合)によってはお勧めできない場合があります。

this2番目のオプションについても、モニターとして使用するかどうかを確認する必要があります。を作成してLock、代わりに使用できます。

于 2012-11-26T11:51:27.493 に答える