- ベストアンサー
SwingUtilities.invokeLater(new Runnable() {}について
- SwingUtilities.invokeLater(new Runnable() {}は何をするのか説明してください
- APIを見ても理解できないSwingUtilities.invokeLater(new Runnable() {}について教えてください
- SwingUtilities.invokeLater(new Runnable() {}の効果や使い方について教えてください
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 これについては、知らなければ、訳がわからないのも無理がないと思います。 Swing はシングルスレッド設計になっています。 複数のスレッドに同時にアクセスされることを考慮されていません。 よって、何か長い処理を別スレッドで実行したとしても、Swing コンポーネントにアクセスするときだけは、SwingUtilities#invokeLater() メソッドなどを使い、イベントディスパッチスレッドに、アクセス部分の処理を委譲します。 まあ、ここまでは、いいのですが、ご質問の件です。 昔は、普通に public static void main(String[] args) { JFrame frame = new JFrame(); ・・・ ・・・ frame.setVisible(true); } こう書いていました。 しかし、ある時、誰か偉い人が、「これって、やばいんじゃない?」と気がついてしまったわけです。 元々、JFrame の構築の段階で、メインスレッドがアクセスしてしまっていますが、イベントディスパッチスレッドが走り始めるのは、JFrame#setVisble() メソッドの時なので、これは、これで、大丈夫だろうと思われていました。 しかし、JFrame#setVisible() メソッド内部で、メインスレッドが残っている間に、いくつかのイベントが発生してしまい、わずかながら Swing コンポーネントに複数スレッドが同時アクセスする時間があると言うことです。 まあ、ほとんどの場合は、問題ないのですが、「問題が発生するかもしれないし、しないかもしれない」ということが問題なのです。 「じゃあ、最初から、イベントディスパッチスレッドにお任せしよう」ということになって、こんな呪文めいた儀式が行われるようになったわけです。
お礼
ありがとうございます。 すごく奥深いのですね。 プログラムが楽しくなってきました。