携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情
本篇我们来了解一下守护式线程的源码,看看守护式线程内部是怎么实现的?
java源码
用户线程执行完后,会调用这个exit方法,英文注释显示这个方法是线程退出之前,做一些资源的回收。
把所有跟这个线程有关的对象都赋值为空,然后就可以等待垃圾回收了。
这个方法结束,java虚拟机就退出了。
jni层面
那这个exit,对应我们的jni层面呢,就这个方法:
这里会回调thread里的exit方法
然后就会把当前线程从活跃线程列表中移除
线程以链表的方式存在,判断当前活跃线程链表中的线程是不是当前线程,如果不是就往后移。
找到后,看看当前节点有没有前驱,如果有就跳过当前节点,如果没有说明删除节点就是第一个节点,直接把头节点指向删除节点的下一个节点。
线程数量就减少1.
如果是非守护线程,非守护线程的数量也减少1.
main线程执行结束之后,会创建虚拟机的销毁线程,然后每当线程数量减少1,就检测,直到这个用户线程等于1的时候就唤醒。
main线程
我们来看一下main线程执行之后,创建销毁虚拟机线程,并阻塞的代码,首先我们找到javaMain方法:
这个方法下面有个leave方法,这里我们就看到了让虚拟机退出的方法,我们找到这个方法的调用
这里有个非守护线程大于1,就一直等待