我需要在任务中断时强制释放资源。为此,我实施了this solution。但是有了这个,当我调用shutdown()
时ScheduledThreadPoolExecutor.getQueue()
中的所有任务都被强制执行,但我的一些工作保留了资源。我检查了很好的行为,我发现了这一点:当一个任务执行时,他不在ScheduledThreadPoolExecutor
队列中(我知道这听起来很明显)。问题是我需要强制释放所有作业(在队列中或执行中)的资源
那么,我如何获得正在执行的作业?你有更好的主意吗?
答案 0 :(得分:2)
您可以维护提交作业时创建的所有Future的列表。 使用此列表取消所有期货。
答案 1 :(得分:1)
你不想打电话
executor.shutdownNow()
将尝试取消当前正在运行的任务(使用Thread.interrupt
,因此您需要在使用中断标志的每个任务中实施“中断策略”。
尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。
除了尽力尝试停止处理主动执行任务之外,没有任何保证。例如,典型的实现将通过Thread.interrupt取消,因此任何无法响应中断的任务都可能永远不会终止。
这将返回一个等待任务列表,因此您可以将其重新放回“等待列表”而不是完全松开它们。您可能还希望通过“等待终止”来跟进,以避免逃避代码。例如,executor.awaitTermination(...)
。
tempus-fugit有一些方便的类来处理这个问题。你只需致电
shutdown(executor).waitingForShutdown(millis(400));
有关详细信息,请参阅here。
此外,您在博客文章中概述的解决方案;我不确定这是否正确。 Future.cancel
只会阻止计划任务。如果您要更新博客中的示例以允许中断(即cancel(true)
,则它与shutdownNow
等效(或多或少)。也就是说,它将调用{{1 (如果你已经实施了中断策略)的底层任务将停止处理。至于中断后的清理,你只需要确保在中断策略实现中适当处理。结果是我认为您可以使用shutdownNow(或取消(true))