我可以在运行后台任务之前取消一个swingworker并等待它完成

时间:2012-07-20 13:12:44

标签: java swingworker future executor

我可以在运行后台任务之前取消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线程上完成。

0 个答案:

没有答案