java - 从 java 中的 ScheduledThreadPoolExecutor --> ExecutorService 滴下中断(kill -15 或 9)信号(Ctrl + C)

标签 java multithreading thread-safety executorservice threadpoolexecutor

我已经阅读了很多这方面的内容,但我不确定处理我的用例的最优雅的方式是什么。我有一个使用 ScheduledThreadPoolExecutor 启动后台计划线程的应用程序。该调度线程又具有池大小为 20 的 ExecutorService。提交到该池的每个新线程将再次具有池大小的 ExecutorService,假设为 50。最低级别的线程除了循环执行一些标准任务外没有做太多事情,每个任务需要一秒到十秒不等。

由于这是一个执行后台任务的后台代理应用程序,因此我们应该能够随时干净地停止它们。问题是我不知道如何将中断/关闭信号 3 级别向下滴到最低线程,以便我可以打破循环并整齐地关闭所有线程。

我正在研究Runtime.addShutdownHook(),但我不太确定它在我的用例中有何用处。我也在考虑在尽可能低的线程级别检查 isInterrupted() ,但我不确定是否 Ctrl + Ckill -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/

相关文章:

java - 无法在上下文加载之前在 spring 中发布自定义事件

java - 线程 "main"java.lang.NoClassDefFoundError : org/apache/commons/logging/LogFactory 中的异常

java - 如何检查二维数组是否越界?

java - 给定线程对象是否可以访问 ThreadLocal 变量

c - 为什么这段代码可重入但不是线程安全的

java - 使用 Java (Android) 连接到 IOCP 服务器

java - 为什么在 Facebook YearClass 中声明非线程 - volatile 参数

c++ - 消息总线的最佳容器

locking - popen - 锁还是不是线程安全的?

java - 如何使静态日历线程安全