Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以取消swingworker并等待它完成后再运行后台任务吗_Java_Swingworker_Future_Executor - Fatal编程技术网

Java 我可以取消swingworker并等待它完成后再运行后台任务吗

Java 我可以取消swingworker并等待它完成后再运行后台任务吗,java,swingworker,future,executor,Java,Swingworker,Future,Executor,我可以取消Swingworker并等待它完成后再运行后台任务吗?或者,我可以向在doInBackground中运行代码的任务发送中断,而不取消整个swing worker 我的问题是我不想在doInBackground中的代码完成之前启动doInBackground中的代码。以前的代码从未在Swingworker上调用cancel,相反,我只是设置了一个易失性布尔值,WidgetController将检查该布尔值,如果设置为closedown,则会正常关闭。这一切都很好,除了WidgetCont

我可以取消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实际完成之前,我不希望它这样做

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);
    }
}