天天看点

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

标签:

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

kill 常见的信号量

kill -l

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

里面只有 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信号量)的方式结束进程

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

很明显触发了 钩子函数

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

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

使用 9的信号量很明显 没有触发钩子函数(所以线网应用为了平滑关闭最好不要使用 9 的信号量)

使用kill -3 试试

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

可以看到输出了JVM 线程栈的信息 还有整个堆的情况 但是钩子函数没有调用,而且进程也没有退出.

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

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

看来跟 -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 试试

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

触发了handle方法了

使用中的意外

如果注册了JVM中已存在的信号量 就会出现下面的异常了.

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

这里随便说下 上文中 kill -3 信号量的输出就是JVM中已经注册了的

标签:

来源: https://blog.csdn.net/java_magicsun/article/details/83047667