2011-11-13 18 views
6

SwingWorkerが正常に終了するのを待ってから、別のSwingWorkerを実行したいと思います。この場合、Encrypteer3はSwingWorkerを拡張するクラスです。SwingWorkerが終了するのを待ちます

マイコード:

input = txtTekst.getText(); 
    key = txtKey.getText(); 
    System.out.println("thread1 start"); 
    Encrypteer3 a = new Encrypteer3(); 
    a.execute(); 
    while(a.isDone()==false){ 
     // do nothing 
    } 
    input = output; 
    key = txtKey1.getText(); 
    System.out.println("thread2 start"); 
    Encrypteer3 b = new Encrypteer3(); 
    b.execute(); 
    while(b.isDone()==false){ 
     // do nothing 
    } 

これは(これを実行する際に、JavaがCPUの約95%を使用しています)私のGUIの凍結を行い、CPUの多くを使用しています。私は問題は、スレッドが完了しているかどうかを常にチェックしているため、CPUを集中的に使用することになります。

SwingWorkerクラスにjoin()メソッドはありません。これをCPUの使用量を減らすにはどうしたらいいですか?

答えて

3

私は、 SwingWorkerのは、あなたが外で実行したい場合は、 は、あなたはそのためにlisternersと発射アクションを使用することができます終えていますときに実行されるコードを定義することができ

protected void done() 

を持って空のループを使用することは悪い考えだと思いますSW

+2

からの例外(複数可)を取得する方法問題は状況に応じてSwingWorkerを別の回数使用することです。私はPropertyChangeListenerを使用し、それはトリックでした! – user1026090

+1

@ user1026090ありがとう:はい、PropertyChangeListenerは、あなたの問題を解決するもう一つの素晴らしい方法です。 1 +あなたとjava、mkorbelとkowserに。 –

3

doneメソッドをSwingWorkerから上書きする必要があります。 SwingWorker#done() doInBackgroundメソッドが終了した後、イベントディスパッチスレッド上で実行

のドキュメントから

。デフォルト実装は何もしません。サブクラスはこのメソッドをオーバーライドして、イベントディスパッチスレッドで完了アクションを実行できます。このメソッドの実装内でステータスを照会することで、このタスクの結果やこのタスクがキャンセルされたかどうかを判断できます。

public class Encrypteer3 extends SwingWorker<Void, Void>{ 

    @Override 
    protected Void doInBackground() throws Exception { 
     // background task 
     return null; 
    } 

    @Override 
    protected void done() { 
     // will be executed when background execution is done 
    } 

} 

と実行に時間がかかっているそのwhile(a.isDone()==false) {

while(a.isDone()==false) { 
    // do nothing 
} 
0
I want to wait for my SwingWorker to finish working, and then I want 
to execute another SwingWorker. 

実装Executorだろうif(isDone)をチェックするよりも良いが、すべてのケースで(SwingWorkerのを意味する)あなたはこのthreadをチェックする必要があり、ネストされた方法(複数可)

関連する問題