我一直在检查类似的问题。 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()
检查以立即将其停止,是否有更好的方法来阻止它在取消后执行?
谢谢。
答案 0 :(得分:0)
您可以在其周围创建包装器,以提供取消闩锁的功能。它需要跟踪等待的线程并在它们超时时释放它们,并记住闩锁已取消,因此将来的等待调用将立即中断。