如何在退出应用程序时关闭所有执行程序?
根据Brian Goetz的Java Concurrency in Practice, JVM无法退出,直到所有(非守护程序)线程都终止,因此无法关闭Executor可能会阻止JVM退出。
即如果存在执行程序,System.exit(0)不一定按预期工作。 似乎有必要放一些
public void stop() { exec.shutdown() }
包含Executors的所有类的方法,然后在应用程序即将终止时调用它们。 这是唯一的方法,还是有某种关闭所有Executors的快捷方式?
没有捷径可以做到这一切,不。 此外,你应该调用shutdownNow()
而不是shutdown()
,否则你可能会等待一段时间。
我想你可以做的是,当你创建Executor时,将它注册在一个中心位置。 然后,当关闭时,只需在该中心对象上调用shutdown()
,然后可以终止每个已注册的执行程序。
如果您使用Spring,那么您可以利用其工厂bean为您创建和管理Executors。 这包括在应用程序退出时正常关闭它们,并节省您自己管理它们的时间。
使用com.google.common.util.concurrent.MoreExecutors#getExitingExecutorService装饰执行程序
@Beta public static ExecutorService getExitingExecutorService(ThreadPoolExecutor executor, long terminationTimeout, TimeUnit timeUnit)
将给定的ThreadPoolExecutor转换为在应用程序完成时退出的ExecutorService。 它通过使用守护程序线程并添加一个关闭钩子等待它们完成来实现。
这主要用于固定线程池。 请参见Executors.newFixedThreadPool(int)。
默认情况下,Executor只会创建非守护程序线程。 您可以通过向Executor提供您自己的ThreadFactory来覆盖它。 这是一个例子:
class DaemonThreadFactory implements ThreadFactory { public Thread newThread(Runnable r) { Thread t = new Thread(r); t.setDaemon(true); return t; } }
但是要小心,因为即使这些线程忙于做有用的工作,JVM也会立即退出!
您还可以提供ThreadFactory的实现,该实现将创建的线程标记为守护线程。 我更喜欢干净的关闭机制(使用生命周期方法),但有些情况下,如果合适,您不需要保证未完成任务的状态/完成。
可能他的意思是说在非守护程序线程完成之前,JVM无法自行停止。 它就像从Java SomeClass这样的命令运行一个简单的类,并且在主方法JVM的执行停止之后。
System.exit是一个JVM终止命令,即使守护程序线程正在运行,JVM也会关闭。
- Maven:将资源包含在JAR中
- Java:在oracle数据库中调用存储过程
- 建造一个巨大的jar子而不是几个小jar子的优点/缺点?
- 如何避免Apache POI中的java.lang.NoSuchMethodError:org.apache.poi.util.IOUtils.copy(Ljava / io / InputStream; Ljava / io / OutputStream;)
- 本地jar不包含在类路径中(` system `)
- Spring MVC中一个表单的许多commandName
- 如何在Linux中使用IntelliJ社区(免费)版本在本地调试Tomcat 7.x / 8.x webapp?
- 从Matlab调用Java时如何避免歧义?
- Java AES / GCM / NoPadding – 什么是cipher.getIV()给我的?