yuu_nkjm blog
2011-05-19(Thu) [長年日記]
[Java][Swing] イベントディスパッチスレッド以外のスレッドからのイベントディスパッチスレッドへのアクセス
概要
イベントディスパッチスレッド(EDT)とは別のスレッドで,重たい計算をさせたい.しかし,Swingのコンポーネントに影響を与える処理を外部のスレッドで行うことはできない.外部からイベントディスパッチスレッドに処理を依頼するときは,SwingUtilities.invokeLaterを用いる.
分かりやすい例
時間のかかる処理を行った後、最後にSwingUtilities.invokeLater()を呼び出しています。これは、「toDoListModel.remove(int index);」および「setButtonsEnabled(true)」の2つの処理をイベントディスパッチスレッドで実行させるために使っています。なぜ、わざわざこのようなことをするのでしょうか?
Swingのスレッドポリシーとして、次のようなものがあります。
「コンポーネントの「状態に依存する」あるいは「状態に影響を与える」 処理はすべてイベントディスパッチスレッド上で動作しなければならない」
これはいい換えると、Swingの描画に関連する処理は、シングルスレッドで処理しなくてはならないということです。そして、そのシングルスレッドがイベントディスパッチスレッドなのです。このルールにのっとるため、わざわざSwingUtilities.invokeLater()を使っているのです。
Swingライブラリのソースコードとサンプル
(snip) public class SwingUtilities implements SwingConstants { (snip) /** * doRun.run() を、AWT イベントディスパッチスレッドで非同期的に実行させます。 * これは、保留中のすべての AWT イベントが処理されたあとに発生します。 * このメソッドは、アプリケーションスレッドが GUI を更新する必要がある * ときに使用されます。次の例では、invokeLater 呼び出しは * イベントディスパッチスレッドに Runnable オブジェクトの * doHelloWorld のキューを呼び出してから、メッセージを出力します。 * * * Runnable doHelloWorld = new Runnable() { * public void run() { * System.out.println("Hello World on " + Thread.currentThread()); * } * }; * * SwingUtilities.invokeLater(doHelloWorld); * System.out.println("This might well be displayed before the other message."); * * invokeLater がイベントディスパッチスレッド、たとえば JButton の * ActionListener から呼び出された場合、doRun.run() は保留中のすべて * のイベントが処理されるまで実行が延期されます。ただし、doRun.run() * がキャッチされない例外をスローする場合は、イベントディスパッチスレッド * (現在のスレッドではない) が状態を元に戻します。 * * このメソッドの追加のドキュメントと例については、「The Java Tutorial」の * * 「How to Use Threads」を参照してください。 * * JDK Version 1.3 以降、このメソッドは java.awt.EventQueue.invokeLater() * を呼び出すだけです。 * * このメソッドは、ほかの Swing のメソッドとは異なり、どのスレッドから * でも呼び出せます。 * * @see #invokeAndWait(Runnable) */ public static void invokeLater(Runnable doRun) { EventQueue.invokeLater(doRun); } (snip)Oracle Java 1.6 SwingUtilitiesクラスソースコードより
関連ページ
- http://arekorebibouroku.hateblo.jp/entry/2011/06/0... ×4
- http://arekorebibouroku.blog.fc2.com/blog-entry-55... ×3
- https://www.google.co.jp/ ×202
- https://www.google.com/ ×8
- http://extrabot.com/help/dribodafirubuha.htm ×7
- http://bluerobot.info/info/dribodafirubuha ×6
- http://arekorebibouroku.seesaa.net/article/2084695... ×5
- http://www.rbot.info/l/vutebuteboko.htm ×3
- http://hesuipr0.hes.hitachi-densa.co.jp/rendering/... ×2
- http://search.mobile.yahoo.co.jp/pcsite/list?sbox=... ×2
- http://search.fenrir-inc.com/?q=xming AWT-EventQue... ×2
- https://www.google.com/search ×2
- http://beamfall.info/info/dribodafirubuha ×2
- https://www.google.co.jp/ ×2
- http://ysearch.luna.tv/search.aspx?puid=3&p=イベントディ... ×1
- https://www.bing.com/ ×1
- http://search.kinza.jp/web/?q=AWTイベントディスパッチ&fr=new... ×1
- http://search.fenrir-inc.com/?hl=ja&channel=sleipn... ×1
- http://hesuipr0.hes.hitachi-densa.co.jp/rendering/... ×1
- http://hesuipr0.hes.hitachi-densa.co.jp/rendering/... ×1
- http://search.fenrir-inc.com/?q=swing スレッド&hl=ja&s... ×1
- http://search.fenrir-inc.com/?hl=ja&channel=s_d_e&... ×1
- http://www.askapache.com/ ×1
- http://hesuipr0.hes.hitachi-densa.co.jp/rendering/... ×1
- イベントディスパッチスレッド ×15 / java イベントディスパッチスレッド ×10 / java swing イベントディスパッチ ×8 / java swing ×6 / java invokeLater ×5 / swing イベントディスパッチスレッド 相互 ×4 / AWT イベントディスパッチスレッド ×4 / swing シングルスレッド ×4 / java swing メッセージディスパッチ ×3 / invokelater java EventQueue thread ×3 / java イベントディスパッチ ×2 / java swing EDT 管理するイベント一覧 ×2 / Swing thread EventQueue ×2 / java 非同期 イベント awt ×2 / ディスパッチスレッド ×2 / AWT イベントディスパッチスレッド 実行 ×2 / java swing 32bitから ×2 / java ディスパッチスレッド ×2 / イベントディスパッチ ×2 / java ディスパッチイベント ×2 / doRun.run ×2 / イベント ディスパッチ ×2 / スレッド ディスパッチ ×2 / java awt イベントディスパッチ ×1 / SwingUtilities#invokeLater ×1 / java ディスパッチループ 例外 ×1 / swing シングルスレッドルール ×1 / invokeLater 例外 ×1 / java 1.6 swing event ×1 / シングルスレッドルール java ×1 / イベントディスパッチスレッドでないスレッド ×1 / AWTイベント 非同期 ×1 / swing イベント ディすパッチ ×1 / Swing Java シングルスレッド イベントキュー ×1 / Android 別のアプリケーションにイベントをディスパッチ ×1 / linux スレッド イベント ×1 / イベントディスパッチャ Swing 例外 ×1 / java swing invokelater ×1 / イベントディスパッチスレッド以外 ×1 / java EventQueue.invokeLater ×1 / イベントディスパッチスレッド とは ×1 / AWTイベントディスパッチスレッド以外のスレッド ×1 / java invokelater invokeAndWait ×1 / java swing フレームワーク edt シングルスレッド イベントキュー ×1 / Java AWT イベントディスパッチスレッド ×1 / Java イベントディスパッチスレッド ×1 / Java Swing イベント スレッド ×1 / swing スレッド イベント ×1 / android キュー イベント保留 ×1 / java SwingUtilities.invokeLater ×1 / monit eventqueue ×1 / Linux イベントディスパッチャ 設定 ×1 / EventQueue.invokeLater ×1 / java スレッド イベント処理 ×1 / イベントディスパッチスレッド イベントキュー イベント処理 ×1 / C++ スレッド ディスパッチ イベント ×1 / swing イベントディスパッチスレッド 競合 ×1 / Java SWING スレッド ×1 / AWTイベントディスパッチスレッド ×1 / イベントディスパッチスレッド以外描画 ×1 / java イベントディスパッチスレッド Exception ×1 / Java イベントディスパッチスレッド 取得 ×1 / EventQueue.invoke Later ×1 / Java イベント自作 ディスパッチ ×1 / SwingUtilities.invokeLater() ×1 / 外部から javaへイベントを ×1 / イベントディスパッチスレッド ×1 / SWIG Windows7 x64 ×1 / java 1.6 new Runnable ×1 / java イベント ディスパッチ ×1 / java swing スレッド ×1 / event ディスパッチ java 1.6 待ち ×1 / Linux スレッド ディスパッチ ×1 / Swingのシングルスレッドルール ×1 / swing 外部イベント 取得 ×1 / イベントディスパッチスレッドとは ×1 / java swing イベントディスパッチスレッド ×1 / doRun.run java ×1 / java swing カレンダー ×1 / 重たい処理 ディスパッチ ×1 / java swing ディスパッチ イベントキュー ×1 / java イベントディスパッチャ ×1 / java イベントディスパッチスレッドとは ×1 / java イベントディスパッチ スレッド ×1 / javaイベントディスパッチスレッド ×1 / Java queue event ×1 / イベント・ディスパッチ・スレッド ×1 / Java メッセージディスパッチ ×1 / swing イベントディスパッチスレッド ×1 / invokeLater ×1 / java invokeLater invokeAndWait ×1 / イベントディスパッチ java ソース ×1 / swing イベントディスパッチスレッド sun ×1 / java swing シングルスレッド ×1 / invokeLater invokeAndWait ×1 / swing イベントディスパッチ ×1 / thread swingutilities ×1 / JAVA SWING 画面イベントをコードから ×1 / Eventqueue java 次のスレッド ×1 / Swingからスレッドにアクセス ×1