携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情
线程钩子代码演示:
这是我准备的示例代码:
一个用户线程,然后一个钩子,看看钩子啥时候执行
钩子是等这个用户线程执行完之后才执行
线程钩子源码解析
这个安全管理器相信大家应该不陌生了,然后调用一个add方法
执行一些判断之后,当hook添加到map中,那钩子是何时执行的呢?我们需要翻源码
jni层面的源码解析
main线程执行之后呢,就会创建一个销毁虚拟机的线程:
然后执行销毁jvm的方法
这个方法做了很多事情,我们可以看英文注释
这里判断非守护线程是不是大于1,是就等待
这里调用了一个钩子函数,看注释是java级别的钩子函数:
然后回调java层面的shutdown方法
java层面的断点调试
我们在shutdown这打个断点,可以看到当前线程是销毁虚拟机线程
执行的就是这个shutdown方法
这个方法下面有个runhooks
点进去这个方法:
那这个run方法在哪呢?
我们的钩子线程没有start,它就在这里start,然后我们的钩子方法就运行了。
总结一下:这个钩子方法就是个线程,在销毁线程回调shutdown方法的时候执行,这个方法的map在虚拟机加载后初始化好,然后把任务添加到shutdown方法中等待调用,逻辑非常严谨。