为什么我不需要关闭javafx.concurrent.Service

时间:2017-03-27 09:12:02

标签: javafx java.util.concurrent

javafx.concurrent.Service在内部使用java.util.concurrent.ExecutorService来执行其任务。使用后需要关闭ExecutorService的实例。 javafx.concurrent.Service似乎不是这种情况。 javafx.concurrent.Service如何以及何时关闭其ExecutorService

1 个答案:

答案 0 :(得分:0)

我认为你的误解来自:

  

使用后需要关闭ExecutorService的实例。

调用shutdown()会阻止ExecutorService接受新任务。如果有意义的话,您只需要这样做(例如,您正试图退出应用程序并希望确保在应用程序退出期间提交的任何新任务都被忽略。例如,这可能发生在计划的执行程序服务中)

相关的shutdownNow()还会尝试中断当前正在运行的任何线程。因此,如果您的任务被实现为优雅地接受中断,则调用shutdownNow()使这些任务有机会执行必要的任何清理操作(关闭连接等)。

然而,在许多用例中,不需要调用这些方法中的任何一种。如果您确信不会向执行人提交进一步的任务,则shutdown()是不必要的。如果您的任务没有长时间运行,则不需要shutdownNow()。当应用程序尝试退出时,任何现有任务都将完成(可能相当快),然后应用程序可以退出。

请注意,如果您的执行程序服务使用守护程序线程,那么当应用程序尝试退出时,这些线程将不会阻止应用程序退出(它们将被终止,不会中断)。因此,如果您的任务是短暂的,不需要清理,并且可以在任何时候安全终止,这是一个可行的策略。

此处javafx.concurrent.Service没有什么特别之处:在某种意义上,它是ExecutorService的包装器,它提供了与FX应用程序线程交互的附加功能。请注意,提供的默认执行程序服务使用守护程序线程,如上所述,如果您的任务需要清理,您可能会提供不同的执行程序服务,并在应用程序的stop()方法中正常关闭它。