我可以在运行后台任务之前取消Swingworker
并等待它完成吗?或者,我是否可以向doInBackground()
中运行代码的任务发送中断而不取消整个摇摆工作者。?
我的问题是我不希望done()
中的代码在doInBackground()
中的代码完成之前启动。早期的代码从未在Swingworker
上调用cancel,而只是设置了WidgetController
将检查的volatile变量,以及是否正常设置为closedown。这一切都很好,除了WidgetController
有时需要很长时间来检查这个标志,所以我需要能够使用中断方法。
当用户点击开始时会显示一个对话框,这会调用WidgetDialogListener
这会创建WidgetWorker
的实例,这会启动WidgetController
,显示WidgetProgressDialog
并正常完成WidgetController
1}}显示ShowWidgetReport
,显示WidgetController
所做的摘要。
WidgetController
正在运行时,显示WidgetProgressDialog
显示进度。如果用户单击取消按钮以停止进度,则会导致中断发送到WidgetController
然后,而不等待widgetcontroller
实际完成已完成方法调用导致{ {1}}显示。但在ShowWidgetReport
实际完成之前,我不希望它这样做。
WidgetController
我使用了雅各布指向我的Waiting for a cancelled future to actually finish所描述的class WidgetDialogListener implements ActionListener
{
public WidgetDialogListener()
{
}
public void actionPerformed(ActionEvent e)
{
StartFixSongsDialog.this.dispose();
WidgetProgressDialog wpd = new FixSongsDialog();
wpd.setVisible(true);
WidgetWorker ww = new WidgetWorker();
wpd.setSwingWorker(ww);
Executors.newSingleThreadScheduledExecutor().submit(ww);
}
}
class WidgetProgressDialog
{
....................
private void actionPerformed(ActionEvent e)
{
//Main.stopTask();
swingWorker.cancel(true);
}
}
class WidgetWorker extends SwingWorker<String, Object>
{
@Override
public String doInBackground() throws Exception
{
new WidgetController().startCreateWidgets();
return "";
}
@Override
protected void done()
{
ShowWidgetReport showReport = new ShowWidgetReport();
showReport.setVisible(true);
}
}
AwaitingWorker
也许误解了解决方案,但无论你采用哪种方式,gui线程最终等待非gui任务完成,而我想要的是非gui任务在任何事情之前完成在gui线程上完成。