守护式线程源码解析

67 阅读2分钟

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

本篇我们来了解一下守护式线程的源码,看看守护式线程内部是怎么实现的?

java源码

用户线程执行完后,会调用这个exit方法,英文注释显示这个方法是线程退出之前,做一些资源的回收。 image.png

把所有跟这个线程有关的对象都赋值为空,然后就可以等待垃圾回收了。 image.png

这个方法结束,java虚拟机就退出了。

jni层面

那这个exit,对应我们的jni层面呢,就这个方法:

image.png

这里会回调thread里的exit方法 image.png

然后就会把当前线程从活跃线程列表中移除

image.png

线程以链表的方式存在,判断当前活跃线程链表中的线程是不是当前线程,如果不是就往后移。

image.png

找到后,看看当前节点有没有前驱,如果有就跳过当前节点,如果没有说明删除节点就是第一个节点,直接把头节点指向删除节点的下一个节点。

image.png

线程数量就减少1.

image.png

如果是非守护线程,非守护线程的数量也减少1.

image.png

main线程执行结束之后,会创建虚拟机的销毁线程,然后每当线程数量减少1,就检测,直到这个用户线程等于1的时候就唤醒。

image.png

main线程

我们来看一下main线程执行之后,创建销毁虚拟机线程,并阻塞的代码,首先我们找到javaMain方法:

image.png

这个方法下面有个leave方法,这里我们就看到了让虚拟机退出的方法,我们找到这个方法的调用

image.png

这里有个非守护线程大于1,就一直等待

image.png