Java优雅关闭的两种方式,源码地址
- 关闭应用后的回调
- 关闭应用前的信号监听
一、关闭应用的回调
通过关闭后的回调实现优雅关闭。
其实应用已经关闭了,只是在关闭时,回调启动一个线程执行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
public class ByHook {
public static void main(String[] args) throws Exception { registerHook(); while (true) { Thread.sleep(1000); System.out.println("running..."); } }
public static void registerHook() { Runtime.getRuntime().addShutdownHook(new Thread(() -> System.out.println("通过Hook关闭: 其实应用已经关闭了,只是在关闭时,回调启动一个线程执行"))); }
}
|
二、关闭应用前的信号监听
收到信号时,决定要进行的操作,如果不打算关闭,则对项目运行不影响。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| import sun.misc.Signal; import sun.misc.SignalHandler;
public class BySignalHandler implements SignalHandler {
public static void main(String[] args) throws Exception { BySignalHandler handler = new BySignalHandler(); Signal.handle(new Signal("TERM"), handler); Signal.handle(new Signal("INT"), handler); while (true) { Thread.sleep(1000); System.out.println("running..."); } }
@Override public void handle(Signal signal) {
switch (signal.getName()) { case "INT": System.out.println("接收到命令 INT"); break; case "TERM": System.out.println("接收到命令 TERM"); break; } } }
|