0

我正在使用一个 ScheduledThreadPoolExecutor ,它每 x (当前为 100) msec 运行一个 ScheduledFuture 。该任务只需几毫秒即可执行。

尝试通过调用future.cancel(true) 取消它并中断可能正在运行的任务,我观察到虽然future 将终止,但任务仍然执行,导致程序错误。从我的日志输出来看,取消似乎发生在最后一次执行期间,但取消它不会中断线程,而是允许它运行到结束。此外,最后一次执行所需的时间也比之前的执行时间长几倍。这种行为是可重现的,但并不总是发生。

据我所知,取消应立即在我的线程中调用中断(),让我可以选择做出相应的反应?奇怪的是,如果我通过在 run() 结束时休眠一段时间来人为地延长任务持续时间,那么中断会按我的预期发生。

有人对这种行为有解释吗?由于它似乎取决于任务持续时间,我认为可能在执行程序服务中实施了一些奇怪的启发式方法来计划出错的执行计划。有没有其他(更智能)的方式来处理这个问题?

4

1 回答 1

0

据我所知,取消应立即在我的线程中调用中断(),让我可以选择做出相应的反应?奇怪的是,如果我通过在 run() 结束时休眠一段时间来人为地扩展任务运行时间,那么中断会按我的预期发生。

如果你中断一个线程,它基本上会设置一个标志。如果你不检查这个标志,或者调用一些检查的东西,就像你所看到的那样,什么都不会发生。Thread.sleep() 确实检查,但你可以检查自己Thread.currentThread().isInterrupted();

有没有其他(更智能)的方式来处理这个问题?

编写您的代码,以便任务检查它是否仍应执行某些操作。我不会仅仅依靠中断来做到这一点。顺便说一句,一些第三方库错误地使用中断或以您可能意想不到的方式处理它们。

于 2013-06-07T10:10:00.190 回答