linux kill常见信号量 在 Java中的应用

linux kill常见信号量 在 Java中的应用

  • kill 常见的信号量

kill -l
linux kill常见信号量 在 Java中的应用_第1张图片
里面只有 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信号量)的方式结束进程

linux kill常见信号量 在 Java中的应用_第2张图片
很明显触发了 钩子函数

  1. 我们在使用 kill -9 pid 的信号量试试

linux kill常见信号量 在 Java中的应用_第3张图片
使用 9的信号量很明显 没有触发钩子函数(所以线网应用为了平滑关闭最好不要使用 9 的信号量

  1. 使用kill -3 试试

linux kill常见信号量 在 Java中的应用_第4张图片
可以看到输出了JVM 线程栈的信息 还有整个堆的情况 但是钩子函数没有调用,而且进程也没有退出.

  1. 我们在试试 kill -(1|2) pid 的效果

linux kill常见信号量 在 Java中的应用_第5张图片
看来跟 -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中已经注册了的

你可能感兴趣的:(java)