ShutdownHook是啥东西?
在Java程序中可以通过添加关闭钩子,实现在程序退出时关闭资源、平滑退出的功能。 使用Runtime.addShutdownHook(Thread hook)方法,可以注册一个JVM关闭的钩子,这个钩子可以在以下几种场景被调用: 1. 程序正常退出 2. 使用System.exit() 3. 终端使用Ctrl+C触发的中断 4. 系统关闭 5. 使用Kill pid命令干掉进程
shutdownHook
是一种特殊的结构,它允许开发人员插入JVM关闭时执行
的一段代码。这种情况在我们需要做特殊清理操作
的情况下很有用
怎么使用?
看下Runtime中的方法
addShutdownHook
public void addShutdownHook(Thread hook) {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(new RuntimePermission("shutdownHooks"));
}
ApplicationShutdownHooks.add(hook);
}
removeShutdownHook
public boolean removeShutdownHook(Thread hook) {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
sm.checkPermission(new RuntimePermission("shutdownHooks"));
}
return ApplicationShutdownHooks.remove(hook);
}
可以看到就是添加一个钩子到JVM里面去,这个钩子就是一个线程,在特定情节下会被调用。
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
System.out.println("程序结束之前最后的反抗");
}));
用法简单,但是呢开发的时候很烦,因为我使用的是IDEA来开发,然后每次Terminate程序的时候点击的IDE的终止按钮。然后百度了一下,发现大部分都是通过另外启一个线程接受在console的输入,然后调用System.exit(0)来terminate程序(IDEA或者Eclipse这样的Terminate是异常中断,调用的System.exit(1))。所以修改了一下程序如下:
package com.design.test;
import java.io.IOException;
/**
* @author zhangxingrui
* @create 2018-06-21 16:24
**/
public class Main {
public static void main(String[] args) {
System.out.println("我是主线程,说点什么好呢?");
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
System.out.println("程序结束之前最后的反抗");
}));
new Thread(() -> {
System.out.println("==============IDE debug==================");
System.out.println("press ENTER to call System.exit(0) ");
System.out.println("==============IDE debug==================");
try {
System.out.println(System.in.read());
} catch (IOException e) {
e.printStackTrace();
}
System.exit(0);
}).start();
}
}
程序运行结果如下:
我是主线程,说点什么好呢?
==============IDE debug==================
press ENTER to call System.exit(0)
==============IDE debug==================
10
程序结束之前最后的反抗
Process finished with exit code 0