linux kill常見信號量 在 Java中的應用

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);
        }
    }

}
  1. 使用 kill pid (默認是SIGTERM信號量)的方式結束進程

shutdown
很明顯觸發了 鉤子函數

  1. 我們在使用 kill -9 pid 的信號量試試

kill -9
使用 9的信號量很明顯 沒有觸發鉤子函數(所以線網應用爲了平滑關閉最好不要使用 9 的信號量

  1. 使用kill -3 試試

在這裏插入圖片描述
可以看到輸出了JVM 線程棧的信息 還有整個堆的情況 但是鉤子函數沒有調用,而且進程也沒有退出.

  1. 我們在試試 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中已經註冊了的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章