| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

差分

ナビゲーションに移動 検索に移動
==[[イベントディスパッチスレッド]]== | [[Java]] | [[Swing]]{{category | [[Category:並行処理}}]]
http://java.sun.com/docs/books/tutorial/uiswing/concurrency/dispatch.html
==GUIスレッド==
「特に意識的に完全にシングルスレッドのプログラムを書かないかぎり、普通のGUIアプリケーションでは、アプリケーションのスレッドとGUIのイベントスレッド、少なくともこの二つのスレッドが動きます。」
「昔はGUIのアプリケーションそのものがシングルスレッドで、GUIのイベントはアプリケーションのメインスレッドの中の"メインイベントループ(main event loop)” と呼ばれるループの中で処理されました。今日のGUIフレームワークはほんの少しだけ違って、イベントディスパッチスレッドと呼ばれるループの中で処理されました。今日のGUIフレームワークはほんの少しだけ違って、[[イベントディスパッチスレッド]](event dispatch thread,EDT)と呼ばれる、GUIイベントを処理する専用のスレッドを作ります。」
| [[http://www.amazon.co.jp/gp/product/4797337206?ie=UTF8&tag=typea09-22&linkCode=as2&camp=247&creative=7399&creativeASIN=4797337206 Java並行処理プログラミング ―その「基盤」と「最新API」を究める―]]
{{amazon|4797337206}}
===[[Swing ]] のイベントハンドリング===*Swing のイベントハンドリングコードは、イベントディスパッチスレッドと呼ばれる特別なスレッド上で実行されます。のイベントハンドリングコードは、[[イベントディスパッチスレッド]]と呼ばれる特別なスレッド上で実行されます。*ほとんどのコードは、Swingのメソッドを同様にこのスレッドで、呼び出します。ほとんどのコードは、[[Swing]]のメソッドを同様にこのスレッドで、呼び出します。*これは、大抵のSwingオブジェクトのメソッドが、スレッドセーフでないため、必要です。これは、大抵の[[Swing]]オブジェクトのメソッドが、スレッドセーフでないため、必要です。
===スレッドセーフでないメソッドの呼び出し===
*いくつかのSwingコンポーネントメソッドはスレッドセーフとAPI仕様に記されています。いくつかの[[Swing]]コンポーネントメソッドはスレッドセーフとAPI仕様に記されています。
*これらは、どんなスレッドからでも安全に呼び出せます。
*その他のSwingコンポーネントメソッドは、イベントディスパッチスレッドから呼び出す必要があります。その他のSwingコンポーネントメソッドは、[[イベントディスパッチスレッド]]から呼び出す必要があります。&lt;<blockquote&gt;>プログラムが、このルールを無視すると、ほとんどの場合きちんと機能するのに、予測や再現性のないエラーが発生しやすくなります。&lt;</blockquote&gt;>
*[[Java Swing 非同期処理の結果をGUIに表示する]] ===コードがイベントディスパッチスレッド上で実行されているかコードが[[イベントディスパッチスレッド]]上で実行されているか===*短いタスクとして、コードがイベントディスパッチスレッド上で実行されているかを考慮することは実用的です。短いタスクとして、コードが[[イベントディスパッチスレッド]]上で実行されているかを考慮することは実用的です。
*ほとんどのタスクは、例えば、ActionListener.actionPerformedのような、イベントハンドリングメソッドとして呼び出されます。
*別のタスクは、invokeLater や invokeAndWait を使ってアプリケーションによりスケジュールされます。
*コードがイベントディスパッチ上で動いているか確認するには、javax.swing.SwingUtilities[[Swing]]Utilities.isEventDispatchThreadを呼び出します。
&lt;<blockquote&gt;コントロール不能のイベントを中止したり、ユーザーインターフェースが無反応にならない為に、イベントディスパッチスレッド上のタスクは、すばやく完了しなければなりません。&lt;>コントロール不能のイベントを中止したり、ユーザーインターフェースが無反応にならない為に、[[イベントディスパッチスレッド]]上のタスクは、すばやく完了しなければなりません。</blockquote&gt;>
===例===
import java.awt.Dimension;
import javax.swing.[[JFrame]];
import javax.swing.JLabel;
import javax.swing.SwingUtilities[[Swing]]Utilities;
* @see http://java.sun.com/docs/books/tutorial/uiswing/components/frame.html
*/
public class JFrameTest [[JFrame]]Test { privat eJFrame e[[JFrame]] frame;
public static void main(String[] args) {
SwingUtilities[[Swing]]Utilities.invokeLater( new Runnable[[R]]unnable(){
public void run() {
JFrameTest [[JFrame]]Test jft = new JFrameTest[[JFrame]]Test();
jft.createUI();
}
private void createUI() {
// Windowの生成
frame = new [[JFrame]]("FrameTest");
// Windowクローズ時にどうするか
frame.setDefaultCloseOperation([[JFrame]].EXIT_ON_CLOSE);
// ダミーコンポーネント
JLabel lbl = new JLabel("");
lbl.setPreferredSize(new Dimension(200,100));
// フレームにコンポーネントを乗せる
frame.getContentPane().add(lbl, BorderLayout.CENTERCENTE[[R]]);
// サイズ調節
frame.pack();
frame.setVisible(true);
// debug イベントディスパッチスレッドか?[[イベントディスパッチスレッド]]か? System.out.println("EventDispatchThread ? " + SwingUtilities[[Swing]]Utilities.isEventDispatchThread());
}
}

案内メニュー