- ベストアンサー
Exception occurred during event dispatching
こんにちは。 JBuilderでappletを作成しています。 wait()とnotify()をプログラム中で利用したところ, 次のようなメッセージが出ました。 Exception occurred during event dispatching: java.lang.IllegalMonitorStateException: current thread not owner 具体的にどのようなことを意味しているのかわかりません。 どなたか教えて下さい。お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> Exception occurred during event dispatching →イベントを送信中に例外が発生した > current thread not owner →現在のスレッドは(オブジェクトのモニタの)オーナーではない (つまり、モニタを所有していない) 文字通り、現在のスレッドがオブジェクトのモニタを所有していないことが例外の原因です。 オブジェクトのモニタを所有するというのは、synchronized ステートメントを使ってオブジェクトを排他的に処理できるようにするということです。 synchronized ステートメントを使って wait() や notify() を使いたいオブジェクトをロックして(モニタの所有権を獲得して)、その中で wait() や notify() を使ってください。 例) try { synchronized (object) { object.wait(); } } catch (InterruptedException e) { }
その他の回答 (1)
- kacchann
- ベストアンサー率58% (347/594)
>が,appletが動作しなくなったり等の結果に おそらく、 wait()を呼ぶことにより(アプレットのイベント処理全般を担当している)イベント処理スレッド(event-dispatching thread)が停止したので、 アプレットがウンともスンとも言わなくなった。 (ボタンを押そうがウインドウのクローズボタンを押そうが反応しない) >描画させる為の値を渡さない時に,描画をさせないように,したい 「描画一時停止」だけのために「wait()/notify()」を使うのは、なんか不自然。 ふつうは使わないと思う。 (※本に載ってるサンプルなどをみても、そういう使いかたではないはず) 「wait()/notify()」は使いかたも難しいので、 「使う必要がないのなら使わない」ほうがいいと思う。 単に「描画一時停止」させたいのなら、代替案を考えよう。 /**代替案1*/ public void paint(Graphics g) { /*「ある条件」が成立したときのみ描画処理を行う*/ if (/*ある条件*/) { … … … } else { //なにもしない } } /**代替案2*/ public void actionPerformed(ActionEvent e) { /*「ある条件」が成立したときのみrepaint()を呼ぶ*/ if (/*ある条件*/) { canvas.repaint(); } else { //なにもしない } }
お礼
やはり「wait()」を使うのは,適していなかったのですね。 第1案をもとに,flag(flagは,あまり気が進まないのですが…) を使用してプログラムを作成しました。 勉強不足が身に染みます…。 ありがとうございました。
補足
wait()は,paint()の中のif文で使用しています。 描画させる為の値を渡さない時に,描画をさせないように,したいのです。 だめもとで, ・描画領域であるCanvas ・this をobjとしてコードを組んでみました。 ・synchronized void paint(){} という様に実行してみました。 が,appletが動作しなくなったり等の結果になりました。 何がまずいのでしょうか? 大変わかりやすい回答なのですが,もう少しお願いします。