こんにちは、Java ソケット プログラミングを使用してマルチプレイヤー ゲームを作成しようとしています。私のサーバーはマルチスレッド環境を使用しています。ループを2回実行し、両方のクライアントからの接続を受け入れます。ループでは、スレッドオブジェクトを使用し、その待機メソッドを呼び出します..ループが終了したら、obj.notifyALlメソッドを呼び出して、現在のスレッドと前のスレッドthreed shoudl 起きて、彼らは仕事を始めますしかし、私はこの例外を取得しています...どんなアイデアや提案も大歓迎です.....
2 に答える
つまり、同期していないオブジェクトを待機または通知しています。
現在のスレッドは、このオブジェクトのモニターを所有している必要があります。スレッドは、このモニターの所有権を解放し、別のスレッドが、このオブジェクトのモニターで待機しているスレッドに、notify メソッドまたは notifyAll メソッドの呼び出しによってウェイクアップを通知するまで待機します。スレッドは、モニターの所有権を再度取得できるまで待機し、実行を再開します。
引数が 1 つのバージョンと同様に、割り込みと偽のウェイクアップが可能であり、このメソッドは常にループで使用する必要があります。
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
IllegalMonitorStateException - 現在のスレッドがオブジェクトのモニターの所有者でない場合。
IMHO待機/通知の代わりに同時実行ライブラリを使用する必要がある可能性があります。
スレッドは機能obj.wait()
するためobj.notifyAll()
に呼び出す必要があります。synchronized
そして、それはブロックから呼び出されるべきです。
synchronized (obj) {
//While condition is not true wait
}
Javadoc#IllegalMonitorStateException
スレッドがオブジェクトのモニターで待機しようとしたことを示すため、または指定されたモニターを所有せずにオブジェクトのモニターで待機している他のスレッドに通知するためにスローされます。