linux kill常見信號量 在 Java中的應用
- kill 常見的信號量
kill -l
裏面只有 9) SIGKILL 信號特別 可以無條件終止進程
- Java 中的鉤子函數
Java 中可以使用 註冊鉤子函數 來監聽進程異常退出時候的事件.
- 註冊鉤子函數
public class Main {
public static void main(String[] args) throws InterruptedException {
long i = 0l;
Runtime.getRuntime().addShutdownHook(new Thread( ()->{
out.println(Thread.currentThread().getName()+": shutdown");
}));
for(;;){
i++;
out.println(i);
TimeUnit.MILLISECONDS.sleep(1000);
}
}
}
- 使用 kill pid (默認是SIGTERM信號量)的方式結束進程
很明顯觸發了 鉤子函數
- 我們在使用 kill -9 pid 的信號量試試
使用 9的信號量很明顯 沒有觸發鉤子函數(所以線網應用爲了平滑關閉最好不要使用 9 的信號量)
- 使用kill -3 試試
可以看到輸出了JVM 線程棧的信息 還有整個堆的情況 但是鉤子函數沒有調用,而且進程也沒有退出.
- 我們在試試 kill -(1|2) pid 的效果
看來跟 -15 信號量是一樣的效果
更多的信號量 大家可以自己試試
## Java 實現監聽信號量 >Q: 如果我們自己要監聽kill 的信號量 要怎麼辦呢。 > A: 實現 SignalHandler 接口的handle 方法
public class CatchSign implements SignalHandler {
@Override
public void handle(Signal signal) {
out.println(signal.getName()+":handle");
}
public static void main(String[] args) throws Exception {
CatchSign cs = new CatchSign();
Signal.handle(new Signal("IO"),cs);
System.in.read();
}
- 使用 kill -23 pid 試試
觸發了handle方法了
- 使用中的意外
如果註冊了JVM中已存在的信號量 就會出現下面的異常了.
這裏隨便說下 上文中 kill -3 信號量的輸出就是JVM中已經註冊了的