由于future线程中任务执行时间比较长,有时候想停都停不下来。所以搞了个static的map:futureMap存放future对象,创建的时候put进去,然后前台通过调用取消接口,调用下面方法对线程进行中断。
public String cancelFuture(int taskId) {
try {
boolean cancelFlag = futureMap.get(taskId).cancel(true);
logger.info("线程中断状态:" + String.valueOf(cancelFlag));
return "SUCCESS";
}catch (Exception e){
logger.error("取消任务失败", e);
return "FAILED";
}finally {
futureMap.remove(batchHisId);
}
}
调试的过程中,发现日志可以打出
线程中断状态:ture
证明是执行了cancel的。但观察任务的情况,实际上线程并没有停下来,线程中的任务会一直执行到完成。
从另外一篇文章(我找不到了)中得到信息,在future的call方法中不能捕获异常,否则中断异常也会被捕获,导致中断失败。
查看日志,是有抛出InterruptedException的。
最终,在call里面修改:
catch(Exception e) {
throw new InterruptedException();
}
中断任务正常,