AWT Event Thread

Swingコンポーネントを使ってGUIを作成する場合でもそうなのですが、 一般に、表示されている画面コンポーネントの内容を書き換えるのには 注意が必要です。

AWTを含めたSwingの各種コンポーネントやSWTのコンポーネント等、GUI部品は、 通常は単一のスレッド(Event-Handling Thread)が描画を行うことを前提として 設計されています。しかし画面コンポーネントに対してはキー操作を始めとして 複数の独立したイベントが非同期に発生しますので、これらのイベントを 一端イベント処理キューに入れ、単一のスレッドがこれらのイベントを順に 処理するようにして、描画が正しく行われることを保証しようとします。

こんな時、別のスレッド、例えばネットワークからのメッセージ受信などを トリガとしたスレッドが画面コンポーネントに描画を行った場合、イベント処理 スレッドの画面処理とぶつかってしまい、表示が正しくできない、あるいは デッドロックに陥るといった問題が発生します。

こうした問題を避けるには、画面コンポーネントへの描画を行っている イベント処理スレッド以外のスレッドで画面コンポーネントへの描画を行いたい 場合、イベント処理スレッドに対して処理を渡す、つまりイベント処理キューに 入れてやる必要があります。

Swingではjavax.swing.SwingUtilitiesというユーティリティクラスの invokeLater()メソッドを使って、画面コンポーネントへの描画処理を イベント処理キューに入れることができます。

public static void javax.swing.SwingUtilities#invokeLater(Runnable doRun);
イベント処理スレッドは、その時点でキューに溜まっている処理をした後に、引数で 指定されたdoRunというRunnableオブジェクトのrun()メソッドを呼び出します。 従って、別スレッドから行いたかった描画処理を、このrun()メソッド内に記述 すればよいのです。


人材開発室 PoisonSoft