如何在ScheduledThreadPoolExecutor中获取正在执行的作业?

时间:2011-08-03 14:06:38

标签: java multithreading concurrency scheduled-tasks

我需要在任务中断时强制释放资源。为此,我实施了this solution。但是有了这个,当我调用shutdown()ScheduledThreadPoolExecutor.getQueue()中的所有任务都被强制执行,但我的一些工作保留了资源。我检查了很好的行为,我发现了这一点:当一个任务执行时,他不在ScheduledThreadPoolExecutor队列中(我知道这听起来很明显)。问题是我需要强制释放所有作业(在队列中或执行中)的资源

那么,我如何获得正在执行的作业?你有更好的主意吗?

2 个答案:

答案 0 :(得分:2)

您可以维护提交作业时创建的所有Future的列表。 使用此列表取消所有期货。

答案 1 :(得分:1)

你不想打电话

executor.shutdownNow()

将尝试取消当前正在运行的任务(使用Thread.interrupt,因此您需要在使用中断标志的每个任务中实施“中断策略”。

来自javadoc的

  

尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。

     

除了尽力尝试停止处理主动执行任务之外,没有任何保证。例如,典型的实现将通过Thread.interrupt取消,因此任何无法响应中断的任务都可能永远不会终止。

这将返回一个等待任务列表,因此您可以将其重新放回“等待列表”而不是完全松开它们。您可能还希望通过“等待终止”来跟进,以避免逃避代码。例如,executor.awaitTermination(...)

tempus-fugit有一些方便的类来处理这个问题。你只需致电

shutdown(executor).waitingForShutdown(millis(400));

有关详细信息,请参阅here

此外,您在博客文章中概述的解决方案;我不确定这是否正确。 Future.cancel只会阻止计划任务。如果您要更新博客中的示例以允许中断(即cancel(true),则它与shutdownNow等效(或多或少)。也就是说,它将调用{{1 (如果你已经实施了中断策略)的底层任务将停止处理。至于中断后的清理,你只需要确保在中断策略实现中适当处理。结果是我认为您可以使用shutdownNow(或取消(true))

正确取消清理