2011-11-13 238 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)