package org.example.testhook;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
/**
* 结论:
* 1.直接点击Debug重启,那么hook线程是会回调的,里面的代码也会执行完毕
* 2.直接点击X,则不会执行hook,属于强杀
* 3.因此线上通过jmx去关闭java进程
*/
public class Main {
public static void main(String[] args) throws IOException {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("hook run start");
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("hook run end");
}
});
// 阻塞这,不让线程退出
System.in.read();
}
}
/*
hook run start
hook run end
*/
总结:
1)hook线程的用途:我们希望在jvm退出时,去执行一下我们的回调。
2)由于游戏服务器中,数据都是定时异步落地,因此希望在关闭服务器时,这些内存中的数据要落地一下。
这时写了hook线程,那么重启这种,其实是会执行hook线程落地的。