Java ScheduledFuture在取消后执行

时间:2013-06-07 10:05:57

标签: java multithreading concurrency executorservice

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

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

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

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

1 个答案:

答案 0 :(得分:0)

  

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

如果你打断一个线程,它基本上会设置一个标志。如果你没有检查这个标志,或者调用那个标志,那么就没有任何事情发生了。 Thread.sleep()会检查,但您可以使用Thread.currentThread().isInterrupted();

进行检查
  

还有其他(更智能)的方式处理问题吗?

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