- - PR -
Swing、得意ですか?
«前のページへ
1|2|3
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2004-01-06 15:32
シングルスレッド規則自体は、基本的には難しいことではないのですよね。 イベントディスパッチスレッド以外のユーザスレッドから、直接画面の再描画を 行う命令を叩いてはいけない、というだけのことです。 (足りないことがありましたら、ベテランさんのフォローをお願いします^^;) ユーザスレッドから再描画等の指示を行いたいときは、java.awt.EventQueue# invokeLater()またはinvokeAndWait()を呼びましょう。 イベントディスパッチスレッドがイベントキューから引っこ抜いて処理してくれ ます。 イベントリスナがハンドリング対象とするイベントの発生時に、該当イベントリ スナのメソッドを呼び出すスレッドはイベントディスパッチスレッド自身ですので、 イベントリスナクラスのメソッド内については、通常気にしなくてOKです。 new java.lang.Thread()で作成したスレッドと、main()から始まるスレッドの コンテキスト内では、再描画は上記のメソッドを使用して間接的に指示しましょう、 ということですね。 この問題の本質は、この規則に関する情報が少ないことではないでしょうか? | ||||
|
投稿日時: 2004-01-06 16:22
unibon です。こんにちわ。
たしかに、入門書などを見てもあまりちゃんと書いてないようにも感じます。 Sun のサイトだと、 http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html あたりにまとまっていたように思います。 #ちなみに URL に 1 と付いているから 2 や 3 もあるのかなと思って探すとあるのですが、 #これらは余計な感じもするようなしないような(あまり良く見ていない)。 http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html http://java.sun.com/products/jfc/tsc/articles/threads/threads3.html なお、Swing を使ったアプリケーションだからと言って無理にマルチスレッドにする必要はそれほどはないと思います。タイマなどには java.util.Timer ではなく javax.swing.Timer を使うようにするなどすれば、コード中にマルチスレッドがあらわに出現することもありません。小規模なアプリケーションならばマルチスレッドにしなくても結構、構築できます。もちろん、長時間かかる処理の途中で別の処理(画面の再描画も含む)も受け付けてくれればそのほうが良いですが、それにかかるコストはかなりのものになりますので、あえてマルチスレッドにしないという選択でも良いと思います。 しかし、マルチスレッドにしないからと言っても、invokeLater などを使うと良い場面ではあえて使っておけば、のちのマルチスレッドへの移行もスムーズになって良いでしょう。 | ||||
«前のページへ
1|2|3
