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

Why do I not need to shutdown javafx.concurrent.Service

javafx.concurrent.Service 在内部使用 java.util.concurrent.ExecutorService 来执行它的任务。 ExecutorService 的实例需要在使用后关闭。 javafx.concurrent.Service 似乎并非如此。 javafx.concurrent.Service 如何以及何时关闭其 ExecutorService

我觉得你这里的误解来自:

Instances of ExecutorService need to be shut down after usage.

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

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

然而,在许多用例中,不需要调用这两种方法中的任何一种。如果您确定不会再向执行者提交任何任务,则 shutdown() 是不必要的。如果你的任务不长-运行,shutdownNow()是不必要的。当应用程序尝试退出时,任何现有任务都将完成(大概很快),然后应用程序可以退出。

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

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