我已经阅读了很多这方面的内容,但我不确定处理我的用例的最优雅的方式是什么。我有一个使用 ScheduledThreadPoolExecutor
启动后台计划线程的应用程序。该调度线程又具有池大小为 20 的 ExecutorService
。提交到该池的每个新线程将再次具有池大小的 ExecutorService
,假设为 50。最低级别的线程除了循环执行一些标准任务外没有做太多事情,每个任务需要一秒到十秒不等。
由于这是一个执行后台任务的后台代理应用程序,因此我们应该能够随时干净地停止它们。问题是我不知道如何将中断/关闭信号 3 级别向下滴到最低线程,以便我可以打破循环并整齐地关闭所有线程。
我正在研究Runtime.addShutdownHook()
,但我不太确定它在我的用例中有何用处。我也在考虑在尽可能低的线程级别检查 isInterrupted()
,但我不确定是否 Ctrl + C
或 kill -9/Kill -15
命令实际上在应用程序内部被转换为中断信号。如果是这样,它将如何向下渗透 3 个级别的线程,或者我是否必须手动中断 Runtime.addShutdownHook() 内的每个线程。
我正在尝试找到一个最优雅、最安全的解决方案。
最佳答案
中断标志与发送到托管 JVM 的进程的 native 操作系统级信号无关。您可以通过调用 thread.interrupt()
在任何线程上设置中断标志。
对于您的问题,我建议将所有 ExecutorService
累积到一个全局集合中,以便您可以在终止时对每个 ExecutorService 调用 shutdownNow()
。如果您使用足够温和的信号来终止进程,则应该执行关闭 Hook ,然后您可以尝试关闭执行程序服务。但请注意,您提交的每个任务都必须是可中断的,这意味着它必须通过实际完成其工作来响应中断标志的设置。这不会隐式发生。
我必须补充一点,我发现您的解决方案包含大量执行器服务,这非常奇怪。除了计划的执行器之外,您还需要一个正确配置的线程池。
关于java - 从 java 中的 ScheduledThreadPoolExecutor --> ExecutorService 滴下中断(kill -15 或 9)信号(Ctrl + C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25553551/