Shutdown Hook中不能执行一些可能会阻塞的操作,否则会导致Java虚拟机无法正常退出。 Shutdown Hook中不能启动新的线程,否则可能会导致JVM无法正常关闭。如果需要在Shutdown Hook中执行耗时的操作,可以考虑使用Executor框架来管理线程。 Shutdown Hook中应该尽量避免抛出异常,否则可能会导致Java虚拟机无法正常退出。 Shutdow...
Runtime.getRuntime().addShutdownHook(newThread(() -> closeScanner())); } 释放连接 ShutdownHook最重要的一个功能就是释放资源,通常如果是非服务形式启动一个JVM进程的话,只有确保JVM进程能够正常退出的话,通常不用担心资源泄露或者无法回收的问题。如果对于Java服务的话,通常使用池化框架来管理连接资源。对于...
2. 在方法上使用@PreDestroy注解,类似@PostConstruct注解使用方法。 1. Runtime.addShutDownHook(Thread hook) //创建HookTest,我们通过main方法来模拟应用程序publicclassHookTest {publicstaticvoidmain(String[] args) {//添加hook thread,重写其run方法Runtime.getRuntime().addShutdownHook(newThread(){ @Overr...
如果程序使用 Java Security Managers,使用 shutdown Hook 则需要安全权限 RuntimePermission(“shutdownHooks”),否则会导致 SecurityException。 实践 例如,我们程序自定义了一个线程池,用来接收和处理任务。如果程序突然奔溃异常退出,这时线程池的所有任务有可能还未处理完成,如果不处理完程序就直接退出,可能会导致数据丢...
1. 不要使用kill -9来结束你的应用程序 kill -9是操作系统的终极杀器,如果你使用kill -9的话,应用程序是没有任何发言权的,它只能选择默默退出,几乎可以肯定,shutdownHook不会被调用。 2. shutdownHook涉及的方法应该尽量的短 这个可能和操作系统有关系,不同的操作系统可能有不同的差异: ...
1. ShutdownHook的注册 当我们添加一个 ShutdownHook 时,ApplicationShutdownHooks.add(hook)将被调用; 传入的钩子线程会被添加到 ApplicationShutdownHooks 类的静态变量 private static IdentityHashMap<Thread, Thread> hooks 中,这个变量维护着所有后续需要使用的钩子。
…Process finished with exit code 0 addShutdownHook方法会把钩子添加到ApplicationShutdownHooks的一个map中保存。当程序退出的时候会会并发把所有的构造同时执行,并没有顺序。这个方法会在Runtime的exit方法调用链中调用,exit方法会调用Shutdown的exit方法,从而会调用sequence方法,最后调用runHooks方法。
ApplicationShutdownHooks.add(hook); } 1. 2. 3. 4. 5. 6. 7. 8. 方法内部调用了ApplicationShutdownHooks#add,我们继续往下看。 2、ApplicationShutdownHooks类 2.1 添加钩子 private static IdentityHashMap<Thread, Thread> hooks; static synchronized void add(Thread hook) { ...
使用shutdownHook需要安全权限 如果我们使用Java Security Managers,则执行添加/删除shutdownHook的代码需要在运行时具有shutdownHooks权限。否则会导致SecurityException。 参考:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread)"官方文档") ...
从表面看,使用Shutdown Hooks是直接向前的。我们所要做的就是编写一个扩展java.lang.Thread类的类,并在public void run()方法中提供我们想要在VM关闭时执行的逻辑。然后我们通过调用Runtime.getRuntime()。addShutdownHook(Thread)方法将此类的实例注册为VM的关闭挂钩。如果需要删除以前注册的关闭挂钩,Runtime类也...