重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

SwingUtilities.invokeLater(new Runnable() {}について

以前質問でgooで教えて頂いた際、以下のようなコードがありました。
どのような効果があるのか教えてください。
APIを見ても理解できませんでした。
また、APIを理解するコツのようなものはあるでしょうか。
ご存知の方がおられましたら教えてください。

・試してみたこと
 重いプログラムを起動させ、実行速度を比べた。------ほとんど同じでした。
 
public static void main(String a[]) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new test();
}
});
}

A 回答 (1件)

 こんにちは。



 これについては、知らなければ、訳がわからないのも無理がないと思います。

 Swing はシングルスレッド設計になっています。
 複数のスレッドに同時にアクセスされることを考慮されていません。
 よって、何か長い処理を別スレッドで実行したとしても、Swing コンポーネントにアクセスするときだけは、SwingUtilities#invokeLater() メソッドなどを使い、イベントディスパッチスレッドに、アクセス部分の処理を委譲します。

 まあ、ここまでは、いいのですが、ご質問の件です。
 昔は、普通に

public static void main(String[] args) {
  JFrame frame = new JFrame();
  ・・・
  ・・・
  frame.setVisible(true);
}

 こう書いていました。
 しかし、ある時、誰か偉い人が、「これって、やばいんじゃない?」と気がついてしまったわけです。

 元々、JFrame の構築の段階で、メインスレッドがアクセスしてしまっていますが、イベントディスパッチスレッドが走り始めるのは、JFrame#setVisble() メソッドの時なので、これは、これで、大丈夫だろうと思われていました。
 しかし、JFrame#setVisible() メソッド内部で、メインスレッドが残っている間に、いくつかのイベントが発生してしまい、わずかながら Swing コンポーネントに複数スレッドが同時アクセスする時間があると言うことです。

 まあ、ほとんどの場合は、問題ないのですが、「問題が発生するかもしれないし、しないかもしれない」ということが問題なのです。

「じゃあ、最初から、イベントディスパッチスレッドにお任せしよう」ということになって、こんな呪文めいた儀式が行われるようになったわけです。

参考URL:http://d.hatena.ne.jp/torutk/20060928#p2
    • good
    • 0
この回答へのお礼

ありがとうございます。
すごく奥深いのですね。
プログラムが楽しくなってきました。

お礼日時:2010/07/05 01:07

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