等待SwingWorker完成

时间:2011-11-13 13:43:38

标签: java multithreading swing concurrency swingworker

我想等待我的SwingWorker完成工作,然后我想执行另一个SwingWorker。在这种情况下,Encrypteer3是一个扩展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 个答案:

答案 0 :(得分:3)

我认为使用空循环是个坏主意, SwingWorker

protected  void done()

您可以在其中定义完成后执行的代码, 那么你可以使用listerners和触发动作,如果你想在SW外执行

答案 1 :(得分:3)

您需要覆盖done的<{1}}方法。

来自SwingWorker#done()

的文档
  

在doInBackground方法完成后在Event Dispatch Thread上执行。默认实现什么都不做。子类可以重写此方法以对Event Dispatch Thread执行完成操作。请注意,您可以在此方法的实现中查询状态,以确定此任务的结果或此任务是否已取消。

SwingWorker

以及需要时间执行的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) {

答案 2 :(得分: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)