Java程式優雅關閉的兩種方式
阿新 • • 發佈:2018-12-17
使用java編寫大型系統時,往往需要在程式被kill時將記憶體中的一些臨時資料和狀態處理掉,這裡稱之為優雅關閉。介紹兩種比較典型的方法:
1. 呼叫Runtime.getRuntime().addShutdownHook()方法,新增結束時執行的執行緒。
public void stopGracefully() { Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { } }); }
2. 實現SignalHandler
public class KillHandler implements SignalHandler { public void registerSignal(String signalName) { Signal signal = new Signal(signalName); Signal.handle(signal, this); } @Override public void handle(Signal signal) { if (signal.getName().equals("TERM")) { // } else if (signal.getName().equals("INT") || signal.getName().equals("HUP")) { // } else { // } } }
程式啟動時例項化一個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,程式便會正常結束。 --------------------- 作者:debug_myself 來源:CSDN 原文:https://blog.csdn.net/carlislelee/article/details/52688693 版權宣告:本文為博主原創文章,轉載請附上博文連結!