こんにちは。
JBuilderでappletを作成しています。
wait()とnotify()をプログラム中で利用したところ,
次のようなメッセージが出ました。
Exception occurred during event dispatching:
java.lang.IllegalMonitorStateException: current thread not owner
具体的にどのようなことを意味しているのかわかりません。
どなたか教えて下さい。お願いします。
No.1ベストアンサー
- 回答日時:
> 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が動作しなくなったり等の結果になりました。
何がまずいのでしょうか?
大変わかりやすい回答なのですが,もう少しお願いします。
No.2
- 回答日時:
>が,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は,あまり気が進まないのですが…)
を使用してプログラムを作成しました。
勉強不足が身に染みます…。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 Results: Two implant failures, one from each subgr 1 2022/12/10 16:49
- その他(プログラミング・Web制作) laravel 本番環境でメールが送れません。 1 2023/02/17 17:57
- フランス語 フランス語単語の意味 3 2023/08/25 09:41
- その他(プログラミング・Web制作) pythonで、tkinterとpillowの組み合わせ 2 2022/08/16 17:42
- その他(OS) Windows10を起動しようと思いましたが、 画像のように?がたくさん並んで、 5 2022/10/09 16:52
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- 英語 提示文の"done"と"taken"の意味の違いについて 3 2022/03/22 14:28
- Perl Windows10においての『Perl』のプログラムについて 1 2022/05/09 16:04
- フランス語 フランス語の動詞について 1 2022/05/23 22:20
- アプリ if文 false kotlin 2 2023/03/27 16:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Exception occurred during eve...
-
VB.NETのSendMessageを教えてく...
-
描画処理が実行されない
-
JAVAでの背景画像表示
-
C# DataGridView のCellPaintin...
-
VB.NET フォーム上に描いたグ...
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
-
EXCEL VBAにて動的にCheckBOXを...
-
インスタンス参照でアクセスで...
-
新規契約でUQモバイル申し込も...
-
変数名の付け方
-
javascriptからjavaを呼び出したい
-
C言語での文字列より値を抜き出す
-
VB.netでメソッドからコントロ...
-
C#において、同じインスタンス...
-
Java初級 引数に適用できません
-
private static という変数の修飾
-
VB.NET getとsetの概念がわかり...
-
VB.NETでフォーム上にExcelのよ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JAVAでの背景画像表示
-
VB.NET フォーム上に描いたグ...
-
VB.NETのSendMessageを教えてく...
-
C# DataGridView のCellPaintin...
-
Javaで文字の角度を変えて表示...
-
canvasで表示されてる画像を1...
-
画面のちらつきの原因が知りた...
-
Labelコントロールの背景をグラ...
-
重なった要素上でのイベントで...
-
java.awt.peer?
-
Canvas等の図形を移動する時,直...
-
OpenLayersの描画を固定で表示...
-
ID3DXSprite::Drawメソッドに関...
-
SwingとEDT(イベントディスパッ...
-
C#のGraphicsクラスについてです。
-
複数画像表示切り替え Visual c++
-
Androidのフォントサイズ(SP)と...
-
Androidで画像の中で指定した範...
-
描画処理が実行されない
-
JavaScript でスライダーを作る...
おすすめ情報