2011-07-30 6 views
6

でさえフリーズ2つのスレッドが終了してスレッドが実行されている間、Guiがフリーズするまで応答し続けます。一度に1つのスレッドしか実行しない場合、この問題は引き続き発生します。JavaのGUIは、私が長いタスクを実行し、結果とのJLabelを更新するSwingWorkerのを使用しようとしているSwingWorkerの

私が間違ってか、私は認識していないよ別の問題がある場合はSwingWorkerのを使用していた場合、誰もが指摘することができれば、私はGREATFULだろう。御時間ありがとうございます。 イアン

編集

doCalculationは()だけで何かの時間がかかります。

private String doCalculation() { 
    for (int i = 0; i < 10000000; i++) { 
     Math.pow(3.14, i); 
    } 
    return threads++ + ""; 
} 
+1

私はあなたがこれまでに投稿したコードで明らかに間違っ何も表示されませんが、私はここでの鍵は 'doCalculation()で何が起こっているのかと思い、'メソッド。このコードを投稿できますか? –

答えて

6

私は申し訳ありませんが、それでもあなたのdoCalculate()メソッドで、私はまだできていませんよあなたの問題を再現する。たとえば、ここに私のsscceです:

import java.awt.event.*; 
import java.util.concurrent.ExecutionException; 
import javax.swing.*; 

public class FooGui { 
    private static int threads = 0; 

    private static void createAndShowUI() { 
     final JLabel label = new JLabel("  "); 
     JButton button = new JButton("Button"); 
     button.addActionListener(new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      new SwingWorker<String, Void>() { 

       @Override 
       protected String doInBackground() throws Exception { 
        return doCalculation(); 
       } 

       @Override 
       protected void done() { 
        try { 
        label.setText(get()); 
        } catch (InterruptedException e) { 
        System.out.println("thread was interrupted"); 
        } catch (ExecutionException e) { 
        System.out.println("there was an ExecutionException"); 
        } 
       } 
      }.execute(); 
     } 
     }); 
     JPanel panel = new JPanel(); 
     panel.add(button); 
     panel.add(label); 

     JFrame frame = new JFrame("FooGui"); 
     frame.getContentPane().add(panel); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    private static String doCalculation() { 
     for (int i = 0; i < 5000000; i++) { 
     Math.pow(3.14, i); 
     } 
     return threads++ + ""; 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      createAndShowUI(); 
     } 
     }); 
    } 
} 

あなたは(リンクをチェックしてください)を作成し、独自の"Short, Self Contained, Correct (Compilable), Example" or SSCCEを投稿することもできます。私はこれを作成する過程で、おそらく問題とその解決策を自分自身で見つけることになるでしょう。もしそうなら、ここに戻って私たちに知らせてください。

これは本当の答えではありませんが、このようなコードをコメントに投稿する方法はありません。

+1

ありがとう、私はそれを感謝します。私はあなたの例でも同じ凍結を見つけましたので、私はそれを試しました。 eclipse /コマンドラインから実行するとこれが再現されます。私は実行可能な瓶を作成し、それは完全に実行されます。私は64ビットWindows 7を実行しています。私はUbuntuで試してみましたが、それも問題を解決するようです。再度、感謝します。 – Ian

+0

私はリスナーの中には見えませんが、私はput ...とは分かりませんが、あなたの投稿は、おそらく可能な方法、いい例、パフォーマンス上の問題ではありません+1 – mKorbel

+1

@Ian:うーん、それらの特定の状況で凍結がなぜ発生するのかを知る。おそらくそれはあまりにも多くのスレッドと関係があるでしょう。私は、SwingWorkerを使用できないときに複数のスレッドを扱うときに、ExecutorServiceとスレッドプールを使用する必要があると聞いています。 –

関連する問題