取消SwingWorker

时间:2018-11-26 10:06:59

标签: java multithreading swing swingworker

我一直在检查类似的问题。 This one与我要询问的内容非常相似,但实际上我没有答案。另外This question我已经检查了。

我的疑问是我有一个SwingWorker,它会在后台进行长时间的处理。

    @Override
   protected final List<Object> doInBackground() throws Exception
   {
    //Should I add if(this.isCancelled) here?
    List<Object> objectList = someFecthingMethod();
    //Should I add if(this.isCancelled) here?
    objectList.forEach(object -> executor.submit(new Helper(object));

    this.latch.await();
    //Should I add if(this.isCancelled) here?
    someOtherLongRunningMethodBasedOnHelperResults();
   }

我从头开始就有这样的代码。当我的计算按钮在单击它时触发工作程序时运行。我也希望能够取消它。我已经编写了所需的方法stop(),其中有工作人员本身的cancel()方法。

就像下面我的工人班级一样,我有如下stop方法:

@Override
public boolean stop()
{
   return this.cancel( true );
} 

调用此方法时,我签入doInBackground()this.isCancelled()返回true.。但是无论如何,它会继续执行doInBackground()中的方法。 所以我的问题是,是否应该在if(this.isCancelled())中的每个方法之前添加doInBackground()检查以立即将其停止,是否有更好的方法来阻止它在取消后执行?

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以在其周围创建包装器,以提供取消闩锁的功能。它需要跟踪等待的线程并在它们超时时释放它们,并记住闩锁已取消,因此将来的等待调用将立即中断。