线程钩子解析

143 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情

线程钩子代码演示:

这是我准备的示例代码:

image.png

一个用户线程,然后一个钩子,看看钩子啥时候执行

钩子是等这个用户线程执行完之后才执行 image.png

线程钩子源码解析

这个安全管理器相信大家应该不陌生了,然后调用一个add方法 image.png

执行一些判断之后,当hook添加到map中,那钩子是何时执行的呢?我们需要翻源码 image.png

jni层面的源码解析

main线程执行之后呢,就会创建一个销毁虚拟机的线程:

image.png

然后执行销毁jvm的方法 image.png

这个方法做了很多事情,我们可以看英文注释 image.png

这里判断非守护线程是不是大于1,是就等待 image.png

这里调用了一个钩子函数,看注释是java级别的钩子函数: image.png

然后回调java层面的shutdown方法 image.png

java层面的断点调试

我们在shutdown这打个断点,可以看到当前线程是销毁虚拟机线程 image.png

执行的就是这个shutdown方法 image.png

这个方法下面有个runhooks image.png

点进去这个方法:

image.png

那这个run方法在哪呢?

image.png

我们的钩子线程没有start,它就在这里start,然后我们的钩子方法就运行了。

image.png

总结一下:这个钩子方法就是个线程,在销毁线程回调shutdown方法的时候执行,这个方法的map在虚拟机加载后初始化好,然后把任务添加到shutdown方法中等待调用,逻辑非常严谨。