首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从java中的ScheduledThreadPoolExecutor -> ExecutorService中滴入中断信号(Ctrl + C) (杀死-15或9)。

从java中的ScheduledThreadPoolExecutor -> ExecutorService中滴入中断信号(Ctrl + C) (杀死-15或9)。
EN

Stack Overflow用户
提问于 2014-08-28 16:22:20
回答 1查看 450关注 0票数 0

我已经读了很多关于这个,但我不知道什么是最优雅的方式来处理我的使用程序。我有一个应用程序,它使用ScheduledThreadPoolExecutor启动后台调度线程。这个计划中的线程在转的时候有一个池大小为20的ExecutorService。每个提交给这个池的新线程都会有一个池大小的ExecutorService,假设是50。最低级别的线程只执行一些标准任务,每个任务从秒到10秒不等。

因为这是一个执行后台任务的后台代理应用程序,所以我们应该能够随时干净地阻止它们。问题是,我不知道如何从中断/关闭信号3级向下滴入最低线程,这样我就可以从循环中挣脱出来,整齐地关闭所有线程。

我当时正在研究Runtime.addShutdownHook(),但我不太确定它在我的使用程序中会有什么用处。我还在尽可能低的线程级别检查isInterrupted(),但我不确定Ctrl + Ckill -9 / kill -15命令是否真的被转换为应用程序中中断的信号。如果是这样的话,它将如何滴下3层线程,或者我必须手动中断Runtime.addShutdownHook()中的每个线程。

我正试图找到一个最优雅和安全的解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-28 17:24:10

中断标志与发送到托管JVM的进程的原生OS级信号无关。您可以通过调用thread.interrupt()在任何线程上设置中断标志。

对于您的问题,我建议将所有的ExecutorService积累到一个全局集合中,以便在终止时调用每个shutdownNow()。如果您使用一个足够温和的信号来终止您的进程,那么应该执行关闭钩子,在那里您可以尝试关闭您的executor服务。但是,请注意,您提交的每个任务都必须是可中断的,这意味着它必须通过实际完成其工作而重新定位到中断标志的设置。这种情况不会含蓄地发生。

我必须补充说,我发现您的解决方案与众多的执行者服务相当奇怪。除了预定的执行器之外,只需一个正确配置的线程池即可。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25553551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档