2015-01-07 3 views
5

Javaは一度に複数のEDTを作成できますか?イベントディスパッチスレッド(EDT)を2つ以上設定する方法はありますか?

私はEDTをセットアップすること、そして何百ものコンポーネントが組み込まれている可能性のある十数個のパネルを持つ「ヘビーデューティ」パネルの内容を更新する方法を実験しています。等々

Measuring "busyness" of the event dispatching thread

How does the event dispatch thread work?

Java Event-Dispatching Thread explanation

http://en.wiki2.org/wiki/Event_dispatching_thread

と:現在、私は次の記事で見てきた

 public void run() { 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        panel.update(); 
       } 
      }); 
     } 

を持っています。

1つのEDTが処理しなければならない数多くのイベントがある場合、Javaはすでにこれらのイベントをグループ化/優先順位付けするための内部スケジューリング機構を持っていることを理解しています。私は?

ウィルjavaの下に新しいスレッドを持つ第二EDT(新しいRunnableを(){...} .start()を作成した場合

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html

"This is necessary because most Swing object methods are not "thread safe": invoking them from multiple threads risks thread interference or memory consistency errors." 

によるだから何自動的にマージスレッドの安全性への恐怖のために戻って一から二EDTs?

 new Thread(new Runnable() { 
     public void run() { 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        panel.update(); 
       } 
      }); 
     } 
    }).start(); 
+3

あなたの2番目のスレッドはEDTではありません;) –

+2

EDTを作成することはできません。スイングは独自のEDTを作成します。あなたは好きなだけ多くのスレッドを作成することができます(最大限の限界まで)が、彼らはEDTではありません。あなたのサンプルコードは 'Runnable'オブジェクトを作成しますが、あなたのスレッドで' panel.update'を実行しません。代わりに、このオブジェクトはどこかに保存されたSwingに渡され、最終的にEDTがそれを見つけて実行します。 – ajb

+0

[Multiple Event Dispatch Threads]の可能な複製(http:// stackoverflow。com/questions/7323306/multiple-event-dispatch-threads) – Jayan

答えて

2

唯一のイベントディスパッチスレッドが存在することができます!

しかし、なぜこのために複数のスレッドが必要なのでしょうか?多くのコンポーネントを持つ「ヘビーデューティ」パネル(アプリケーションでは、現在作業中のコンポーネントが1000個でなければならない)でもEDTが1つあれば十分です。多くのCPU時間を使用するEDTではタスクを実行しないでください。そうしないと、更新イベントのEDTがブロックされ、ユーザーの入力に応答してGUIが「低速」になります。

また、多くのコンポーネントがスレッド・セーブではないため、すべてのGUIコンポーネントはEDT内からのみ作成および操作する必要があります。このガイドラインを無視すると、特定のタスクではうまくいくかもしれませんが、遅かれ早かれ、奇妙な動作やクラッシュが発生します。

+1

クラス内で行った計算は、パネルとコンポーネントの作成も担当しています。だから私は、GUIからコアロジックを別のクラスに分けるのが良い方法だと思います。 – mk7

+0

正解!一般的には、[Model-View-Controller](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)のパターンを見たいと思っています。また、常にEDT上でGUIコンポーネントの作成と操作が確実に実行されるようにします。たいていの場合、これはコード内でコードを呼び出すと自動的に行われます。 (EDT上で実行される)ActionListenerですが、GUI要素に別のスレッドからアクセスする場合は、SwingUtilities.invokeLaterまたはSwingUtilities.invokeAndWaitを使用する必要があります。 –

1

スイングGUIはシングルスレッドです。その1つのスレッドはEDTです。 2番目のEDTを導入したいが(まだGUIが動作している)、スレッドセーフの複雑さを補うために、多くの内部Swingコードを書き直す必要があります。

別のEDTを追加すると、パフォーマンスが未知の量(または減少)になるほど複雑さが増します。

関連する問題