アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。
JBuilderでappletを作成しています。
wait()とnotify()をプログラム中で利用したところ,
次のようなメッセージが出ました。

Exception occurred during event dispatching:
 java.lang.IllegalMonitorStateException: current thread not owner

具体的にどのようなことを意味しているのかわかりません。
どなたか教えて下さい。お願いします。

A 回答 (2件)

> Exception occurred during event dispatching


→イベントを送信中に例外が発生した
> current thread not owner
→現在のスレッドは(オブジェクトのモニタの)オーナーではない
(つまり、モニタを所有していない)

文字通り、現在のスレッドがオブジェクトのモニタを所有していないことが例外の原因です。
オブジェクトのモニタを所有するというのは、synchronized ステートメントを使ってオブジェクトを排他的に処理できるようにするということです。
synchronized ステートメントを使って wait() や notify() を使いたいオブジェクトをロックして(モニタの所有権を獲得して)、その中で wait() や notify() を使ってください。

例)
try {
synchronized (object) {
object.wait();
}
} catch (InterruptedException e) {
}

この回答への補足

wait()は,paint()の中のif文で使用しています。
描画させる為の値を渡さない時に,描画をさせないように,したいのです。

だめもとで,
・描画領域であるCanvas
・this
をobjとしてコードを組んでみました。
・synchronized void paint(){}
という様に実行してみました。
が,appletが動作しなくなったり等の結果になりました。
何がまずいのでしょうか?
大変わかりやすい回答なのですが,もう少しお願いします。

補足日時:2004/01/13 16:58
    • good
    • 0

>が,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 {
  //なにもしない
 }
}
    • good
    • 0
この回答へのお礼

やはり「wait()」を使うのは,適していなかったのですね。
第1案をもとに,flag(flagは,あまり気が進まないのですが…)
を使用してプログラムを作成しました。
勉強不足が身に染みます…。

ありがとうございました。

お礼日時:2004/01/19 18:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!