繁体   English   中英

在Java中完成SwingWorker之后启动另一个线程

[英]Start another thread after SwingWorker completes in Java

我知道有很多关于SO的问题,但是没有一个问题有足够好的答案,在问到这里之前,我专门搜索了很多SO,但是没有什么可以弄清楚的。 我只是想在我的SwingWorker完成工作时启动另一个线程。

我想在SwingWorker完成工作后启动一个计时器,但无法弄清楚如何。

class createGUI extends SwingWorker<Void, Void>
{
    @Override
    protected Integer doInBackground() throws Exception
    {
         //Some long processing
    }

    @Override
    protected void done()
    {
         //Doing GUI work here
         prgBar.setInderminent(false);
    }
}

//Starts a progressBar and calls createGUI();
prgBar.setInderminent(true);
new createGUI().execute();

现在,有另一个我想在此SwingWork完成时启动的startTimer线程。

public class startTimer implements Runnable
{
     @Override
     public void run()
     {
         while(true)
         {
             Thread.sleep(1000);
             //Update Database
         }
     }
}

但是我不知道该怎么办?

除非我缺少什么,否则您可以在构造函数中传递一个引用到createGUI并在done()时启动它。

class createGUI extends SwingWorker<Void, Void>
{
  private Thread startTimer;
  public createGUI(Thread startTimer) {
    this.startTimer = startTimer;
  }
  @Override
  protected Integer doInBackground() throws Exception {
     //Some long processing
  }

  @Override
  protected void done()
  {
     //Doing GUI work here
     prgBar.setInderminent(false);
     startTimer.start();
  }
}

您还需要更改

new createGUI().execute();

new createGUI(new Thread(new startTimer())).execute();

另外,班级名称应以大写字母开头。 CreateGUIStartTimer

注意:Elliot的答案没有错,希望它将工作流程与工作人员耦合,并将对象引用传递给工作人员,否则将不需要(他的答案为+1)

作为传递对可能不需要了解或关心此类事情的类的引用的替代方法,可以使用SwingWorkerPropertyChangeListener支持。

这使工人脱钩,使其更可重复使用。

CreateGUI worker = new CreateGUI();
worker.addPropertyChangeListener(new PropertyChangeListener() {
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if ("state".equals(evt.getPropertyName())) {
            SwingWorker.StateValue state = (SwingWorker.StateValue) evt.getNewValue();
            switch (state) {
                case DONE:
                    prgBar.setInderminent(false);
                    startTimer.start();
                    break;
            }
        }
    }
});
worker.execute();

它将简单地运行...

public class CreateGUI extends SwingWorker<Integer, Integer> {

    @Override
    protected Integer doInBackground() throws Exception {
        // Working hard or hardly working...
        return ???;
    }
}

就像一个旁注(由于工作人员的名字让我感到惊讶)一样,Swing不是线程安全的,您不应从事件调度线程之外创建或修改UI元素。

更新...

如果您要做的只是链接线程的执行,那么您可以使用单个线程的ExecutorService ,例如...

ExecutorService es = Executors.newSingleThreadExecutor();
es.submit(new CreateGUI());
es.submit(new StartTimer());

es.shutdown();

这可以确保StartTimerCreateGUI完成或失败之前无法运行...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM