public class ExampleSignalHandler {
public static void main(String... args) throws InterruptedException {
final long start = System.nanoTime();
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
System.out.format("\nProgram execution took %f seconds\n", (System.nanoTime() - start) / 1e9f);
}
}));
int counter = 0;
while(true) {
System.out.println(counter++);
Thread.sleep(500);
}
}
}
这工作得很好,但如果我在我目前的应用程序中这样做,它不会执行
kill -TERM <pid>
但是在
kill -1 <pid>
kill -KILL <pid>
但是由于这些信号,我没有足够的时间在关闭应用程序之前进行操作。
我的应用程序中使用了几个线程和一个 JNI Wrapper,什么会导致在 kill -TERM 上未调用 shutdownHook 的问题?
我需要这个,因为我的应用程序使用网络协议,我可以在其中订阅变量。这个句柄必须在关闭之前取消订阅,否则服务器会因为一段时间后的句柄过多而耗尽内存(服务器不在我的控制范围内!)