Java程序优雅关闭的两种方法

使用java编写大型系统时,往往需要在程序被kill时将内存中的一些临时数据和状态处理掉,这里称之为优雅关闭。介绍两种比较典型的方法:

1. 调用Runtime.getRuntime().addShutdownHook()方法,添加结束时运行的线程。

[java] view plain copy
  1. public void stopGracefully() {  
  2.          
  3.         Runtime.getRuntime().addShutdownHook(new Thread() {  
  4.             @Override  
  5.             public void run() {  
  6.                  
  7.             }  
  8.         });  
  9. }  


2. 实现SignalHandler
[java] view plain copy
  1. public class KillHandler implements SignalHandler {  
  2.   
  3.     public void registerSignal(String signalName) {  
  4.         Signal signal = new Signal(signalName);  
  5.         Signal.handle(signal, this);  
  6.     }  
  7.   
  8.     @Override  
  9.     public void handle(Signal signal) {  
  10.          
  11.         if (signal.getName().equals("TERM")) {  
  12.                 //  
  13.         } else if (signal.getName().equals("INT") || signal.getName().equals("HUP")) {  
  14.                 //  
  15.         } else {  
  16.                 //  
  17.         }  
  18.     }  
  19.   
  20. }  

        程序启动时实例化一个KillHandler,注册TERM信号。
        KillHandler killHandler = new KillHandler();
        killHandler.registerSignal("TERM");
        这样,在进程被kill的时候就会触发KillHandler的handle方法。

3. 区别
    
    两种方法的区别在于,第一种方法在进程被kill的时候main函数就已经结束了,仅会运行shutdownHook中run()方法的代码。
    而第二种方法中handle函数会在进程被kill时收到TERM信号,对main函数的运行不会有任何影响,我们需要自己在main函数中添加布尔类型的flag,当收到TERM信号时修改该flag,程序便会正常结束。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读