我正在使用一个 ScheduledThreadPoolExecutor ,它每 x (当前为 100) msec 运行一个 ScheduledFuture 。该任务只需几毫秒即可执行。
尝试通过调用future.cancel(true) 取消它并中断可能正在运行的任务,我观察到虽然future 将终止,但任务仍然执行,导致程序错误。从我的日志输出来看,取消似乎发生在最后一次执行期间,但取消它不会中断线程,而是允许它运行到结束。此外,最后一次执行所需的时间也比之前的执行时间长几倍。这种行为是可重现的,但并不总是发生。
据我所知,取消应立即在我的线程中调用中断(),让我可以选择做出相应的反应?奇怪的是,如果我通过在 run() 结束时休眠一段时间来人为地延长任务持续时间,那么中断会按我的预期发生。
有人对这种行为有解释吗?由于它似乎取决于任务持续时间,我认为可能在执行程序服务中实施了一些奇怪的启发式方法来计划出错的执行计划。有没有其他(更智能)的方式来处理这个问题?