2011-11-13 302 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 
    } 

這使我的GUI凍結,並使用大量的CPU(執行此當Java使用約95%的CPU)。我認爲問題在於它經常檢查線程是否完成,這就是CPU佔用太多的原因。

SwingWorker類沒有join()方法。我怎樣才能使這個CPU密集度更低?

回答

3

我想用空循環是壞主意, 的SwingWorker有

protected void done() 

在那裏它結束時, 那麼你可以,如果你想外面執行使用listerners和擊發動作的,你可以定義執行代碼SW

+2

異常(S)問題在於我根據情況使用該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. 

不是檢查if(isDone)將器具Executor更好,但在所有的情況下(這意味着SwingWorker類),你需要檢查這個thread,如何從嵌套方式(S)