2012-03-13 10 views
-1

スレッドを使用するJavaアプリケーションがあります。私のスレッドは20秒ごとに実行されますが、実行するとUIの種類がブロックされます... i。 e。スレッドが実行されているときにユーザーがUIの何かのボタンをクリックすると、時々応答しません。マルチスレッドとUIの動作

誰でも私にこの問題の解決方法を教えてもらえますか?

+3

バックグラウンドスレッドとUIがどのように機能しているかを示すために、いくつかのコードサンプルを提供する必要があります。 – Gray

+0

uiスレッドは基本的にUIのラベルを更新し、UIに5つのボタンがあります – koool

+0

バックグラウンドスレッドはこのラベルをどのように更新しますか?バックグラウンドスレッドとUIスレッドはどのようにデータを共有していますか?そうでなければ私たちはちょうど推測しているいくつかのコードを示してください。 – Gray

答えて

3

javaスイングでは、UIの状態に対する変更は、EDT(イベントディスパッチャスレッド)と呼ばれる単一の既存のスレッドで行う必要があります。

そうでない場合は、通常、奇妙な不具合や凍結が発生します。最も一般的な症状の1つは、UIの一部が灰色になることです(ただし、Java 1.6以降、UIは以前と同じように描画されますが、応答はありません)。

SwingUtilities.invokeLater(Runnable toRunInEDT); 

ノートあなたはinvokeLaterを呼び出す場合、実行可能が実行されていることを持っていた後、すべての現在キューイベント:

行くには良い方法はEDTのUIに変更をキューに専用のメソッドを使用することです派遣されました。つまり、コードの次の行がより前に実行され、のコードが実行可能になることを意味します。同期バージョンは(EDTから実行すべきではない)にもあります:edralzarが言ったことの上に

SwingUtilities.invokeAndWait(Runnable toRunInEDT); 
+0

+1多くのことを説明してくれてありがとうございます – koool

+2

スイングリスナー内のコード(JButtonのActionListenerなど)**はEDT内で実行されます** –

2

あなたが参照しているスレッド(20秒ごとに実行される)のようなサウンドは、UIを管理するスレッドです。

解決策は、2つのプロセスを異なるスレッドに分離することです。

+0

+1ありがとう!alot – koool

3

いくつかの追加のヒント:

あなたがいるかどうかを確認するために便利なメソッドSwingUtilities.isEventDispatchThread()を使用することができます実際にはイベントディスパッチスレッド上でコードが実行されています。 edralzar氏によると、GUIコンポーネントを作成したり、GUIコンポーネントの状態を変更したり、Event Dispatch Threadで実行するGUIコンポーネントの状態を読み込んだりするコードです。

しかし、もう1つ考慮すべき点は、EDTで実行されているコードは、すぐにを実行できることです。イベントディスパッチスレッドのすべてを実行するだけでは解決できません。次の操作を行うと、GUIは5秒間フリーズします。

SwingUtilities.invokeLater(new Runnable(){ 
     public void run(){ 
      try{ 
       Thread.currentThread().sleep(5000); 
      }catch(InterruptedException e){ 
       //Ignored in this example 
      } 
     } 
    }); 

なぜフリーズしますか?すべてのGUIイベントとGUIアップデートはEDT上で実行されるため、EDTが5000ミリ秒間スリープすると、その間にGUIアップデートは実行できません。

This articleは面白いかもしれません。

+0

非常に良い点は、記事が面白いです。 Java 6のSwingWorkerクラスを使用すると、最後のポイントに対処できます(この記事で説明したように) –

関連する問題