我已经读了很多关于这个,但我不知道什么是最优雅的方式来处理我的使用程序。我有一个应用程序,它使用ScheduledThreadPoolExecutor启动后台调度线程。这个计划中的线程在转的时候有一个池大小为20的ExecutorService。每个提交给这个池的新线程都会有一个池大小的ExecutorService,假设是50。最低级别的线程只执行一些标准任务,每个任务从秒到10秒不等。
因为这是一个执行后台任务的后台代理应用程序,所以我们应该能够随时干净地阻止它们。问题是,我不知道如何从中断/关闭信号3级向下滴入最低线程,这样我就可以从循环中挣脱出来,整齐地关闭所有线程。
我当时正在研究Runtime.addShutdownHook(),但我不太确定它在我的使用程序中会有什么用处。我还在尽可能低的线程级别检查isInterrupted(),但我不确定Ctrl + C或kill -9 / kill -15命令是否真的被转换为应用程序中中断的信号。如果是这样的话,它将如何滴下3层线程,或者我必须手动中断Runtime.addShutdownHook()中的每个线程。
我正试图找到一个最优雅和安全的解决方案。
发布于 2014-08-28 17:24:10
中断标志与发送到托管JVM的进程的原生OS级信号无关。您可以通过调用thread.interrupt()在任何线程上设置中断标志。
对于您的问题,我建议将所有的ExecutorService积累到一个全局集合中,以便在终止时调用每个shutdownNow()。如果您使用一个足够温和的信号来终止您的进程,那么应该执行关闭钩子,在那里您可以尝试关闭您的executor服务。但是,请注意,您提交的每个任务都必须是可中断的,这意味着它必须通过实际完成其工作而重新定位到中断标志的设置。这种情况不会含蓄地发生。
我必须补充说,我发现您的解决方案与众多的执行者服务相当奇怪。除了预定的执行器之外,只需一个正确配置的线程池即可。
https://stackoverflow.com/questions/25553551
复制相似问题