- PR -

Swing、得意ですか?

投稿者投稿内容
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-01-06 15:32
引用:
その中で、特にスレッド関連には要注意だと
感じました。なぜなら、どのような点で
スレッド関連に注意しなければならないか、
未だハッキリとイメージがつかめないからです。



シングルスレッド規則自体は、基本的には難しいことではないのですよね。
イベントディスパッチスレッド以外のユーザスレッドから、直接画面の再描画を
行う命令を叩いてはいけない、というだけのことです。
(足りないことがありましたら、ベテランさんのフォローをお願いします^^;)

ユーザスレッドから再描画等の指示を行いたいときは、java.awt.EventQueue#
invokeLater()またはinvokeAndWait()を呼びましょう。
イベントディスパッチスレッドがイベントキューから引っこ抜いて処理してくれ
ます。

イベントリスナがハンドリング対象とするイベントの発生時に、該当イベントリ
スナのメソッドを呼び出すスレッドはイベントディスパッチスレッド自身ですので、
イベントリスナクラスのメソッド内については、通常気にしなくてOKです。
new java.lang.Thread()で作成したスレッドと、main()から始まるスレッドの
コンテキスト内では、再描画は上記のメソッドを使用して間接的に指示しましょう、
ということですね。

この問題の本質は、この規則に関する情報が少ないことではないでしょうか?
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-01-06 16:22
unibon です。こんにちわ。

引用:

シュンさんの書き込み (2004-01-06 15:32) より:
この問題の本質は、この規則に関する情報が少ないことではないでしょうか?


たしかに、入門書などを見てもあまりちゃんと書いてないようにも感じます。
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 などを使うと良い場面ではあえて使っておけば、のちのマルチスレッドへの移行もスムーズになって良いでしょう。

スキルアップ/キャリアアップ(JOB@IT)