Java 我可以取消swingworker并等待它完成后再运行后台任务吗
我可以取消Swingworker并等待它完成后再运行后台任务吗?或者,我可以向在doInBackground中运行代码的任务发送中断,而不取消整个swing worker 我的问题是我不想在doInBackground中的代码完成之前启动doInBackground中的代码。以前的代码从未在Swingworker上调用cancel,相反,我只是设置了一个易失性布尔值,WidgetController将检查该布尔值,如果设置为closedown,则会正常关闭。这一切都很好,除了WidgetController有时需要很长时间来检查这个标志,所以我需要能够使用中断方法 伪例子 当用户单击“开始”时,将显示一个对话框。该对话框调用WidgetDialogListener。该对话框创建WidgetWorker实例,启动WidgetController,显示WidgetProgressDialog。在WidgetController正常完成时,将显示ShowWidgetReport,其中显示WidgetController所做工作的摘要 当WidgetController运行时,将显示WidgetProgressDialog以显示进度。如果用户单击cancel按钮停止进度,这将导致向WidgetController发送中断,然后在不等待WidgetController实际完成的情况下调用done方法,从而显示ShowWidgetReport。但在WidgetController实际完成之前,我不希望它这样做Java 我可以取消swingworker并等待它完成后再运行后台任务吗,java,swingworker,future,executor,Java,Swingworker,Future,Executor,我可以取消Swingworker并等待它完成后再运行后台任务吗?或者,我可以向在doInBackground中运行代码的任务发送中断,而不取消整个swing worker 我的问题是我不想在doInBackground中的代码完成之前启动doInBackground中的代码。以前的代码从未在Swingworker上调用cancel,相反,我只是设置了一个易失性布尔值,WidgetController将检查该布尔值,如果设置为closedown,则会正常关闭。这一切都很好,除了WidgetCont
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);
}
}
也许你误解了解决方案,但不管你怎么做,gui线程最终都会等待非gui任务完成,而我想要的是非gui任务在gui线程上完成之前完成。如果你还没有想法,请查看。@Paul Taylor不确定你到底想做什么。。。,你能不能请@mKorbel嗨,对不起,我不明白你在问我什么
abstract class AwaitingWorker<T, V> extends SwingWorker<T, V>
{
private final CountDownLatch actuallyFinishedLatch = new CountDownLatch(1);
protected abstract T performOperation() throws Exception;
@Override
protected final T doInBackground() throws Exception
{
try
{
return performOperation();
}
finally
{
actuallyFinishedLatch.countDown();
}
}
public void awaitActualCompletion() throws InterruptedException
{
actuallyFinishedLatch.await();
}
}
class WidgetWorker extends AwaitingWorker<String, Object>
{
@Override
public String performOperation() throws Exception
{
new WidgetController().startCreateWidgets();
return "";
}
@Override
protected void done()
{
try
{
awaitActualCompletion();
}
catch(InterruptedException ioe)
{
}
ShowWidgetReport showReport = new ShowWidgetReport();
showReport.setVisible(true);
}
}