[英]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();
另外,班级名称应以大写字母开头。 CreateGUI
和StartTimer
注意:Elliot的答案没有错,希望它将工作流程与工作人员耦合,并将对象引用传递给工作人员,否则将不需要(他的答案为+1)
作为传递对可能不需要了解或关心此类事情的类的引用的替代方法,可以使用SwingWorker
的PropertyChangeListener
支持。
这使工人脱钩,使其更可重复使用。
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();
这可以确保StartTimer
在CreateGUI
完成或失败之前无法运行...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.