【问题标题】:Wait for SwingWorker to finish等待 SwingWorker 完成
【发布时间】:2011-12-28 01:22:12
【问题描述】:

我想等待我的 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 密集度?

【问题讨论】:

    标签: java multithreading swing concurrency swingworker


    【解决方案1】:

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

    protected  void done()
    

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

    【讨论】:

    • 问题是我根据情况使用该 SwingWorker 的次数不同。我使用了 PropertyChangeListener 并且成功了!谢谢你的回答
    • @user1026090:是的,PropertyChangeListener 是解决问题的另一种好方法。 1+ 给你和 java、mkorbel 和 kowser。
    【解决方案2】:

    您需要从 SwingWorker 覆盖 done 方法。

    来自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
    }
    

    【讨论】:

      【解决方案3】:
      I want to wait for my SwingWorker to finish working, and then I want 
      to execute another SwingWorker.
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-28
        • 1970-01-01
        • 2012-07-07
        • 1970-01-01
        • 2020-10-04
        • 2020-07-04
        • 2011-09-08
        • 1970-01-01
        相关资源
        最近更新 更多