• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SwingUtilities.invokeLater(new Runn)

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

このQ&Aのポイント
  • SwingUtilities.invokeLater(new Runnable() {}は何をするのか説明してください
  • APIを見ても理解できないSwingUtilities.invokeLater(new Runnable() {}について教えてください
  • SwingUtilities.invokeLater(new Runnable() {}の効果や使い方について教えてください

質問者が選んだベストアンサー

  • ベストアンサー
  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.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
hatokamome
質問者

お礼

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

関連するQ&A