首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待SwingWorker完成

等待SwingWorker完成
EN

Stack Overflow用户
提问于 2011-11-13 21:43:38
回答 3查看 10.6K关注 0票数 7

我想等待我的SwingWorker完成工作,然后我想执行另一个SwingWorker。在本例中,Encrypteer3是一个扩展SwingWorker的类。

我的代码:

代码语言:javascript
复制
    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的消耗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-13 21:50:28

我认为使用空循环是不好的主意,SwingWorker

代码语言:javascript
复制
protected  void done()

你可以定义代码在完成时执行,然后如果你想在SW之外执行,你可以使用listerners和触发动作

票数 3
EN

Stack Overflow用户

发布于 2011-11-13 21:58:32

您需要覆盖SwingWorker中的done方法。

来自SwingWorker#done()的文档

doInBackground方法完成后在事件调度线程上执行的

。默认实现不执行任何操作。子类可以重写此方法以在事件调度线程上执行完成操作。请注意,您可以在此方法的实现内部查询状态,以确定此任务的结果或此任务是否已被取消。

代码语言:javascript
复制
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) {的执行则需要时间。

代码语言:javascript
复制
while(a.isDone()==false) {
    // do nothing
}
票数 3
EN

Stack Overflow用户

发布于 2011-11-13 22:22:51

代码语言:javascript
复制
I want to wait for my SwingWorker to finish working, and then I want 
to execute another SwingWorker.

比检查if(isDone)更好的是实现Executor,但在所有情况下(即SwingWorker),您都必须检查此thread,如何从嵌套方法中获取异常

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8111946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档