![Java多线程并发体系实战(微课视频版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/362/52842362/b_52842362.jpg)
上QQ阅读APP看书,第一时间看更新
1.7 守护线程
当JVM启动时,通常有一个非守护线程(通常指运行某个指定类的名为main的主方法)称为主线程。JVM继续运行,直到发生以下情况:
(1)已调用Runtime对象的退出方法,并且安全管理器已允许进行退出操作。
(2)所有不是守护线程的线程都已经被销毁。
1.获得当前线程对象是否为守护线程
可以通过Thread线程对象的isDaemon()方法获得此线程是否为守护线程。如果此线程是守护线程,则返回值为true,否则返回值为false。
2.设置当前线程对象是否为守护线程
可以通过Thread线程对象的setDaemon(boolean on)方法将此线程对象标记为守护线程或非守护线程,当所有执行的线程都是守护线程时,JVM退出。
在默认情况下创建线程对象时,会从当前执行线程对象中获得并初始化,如图1-9所示。
![](https://epubservercos.yuewen.com/DAFF96/31397728807979506/epubprivate/OEBPS/Images/Figure-P21_9928.jpg?sign=1738831634-z33VDpypaQ3O0nP3n8vYOHsbnBh9vtGK-0-bd88182dc3e2f127e79b67018e2bb69f)
图1-9 初始化守护线程状态
当平时使用main(String[]args)主方法运行时,主方法的执行线程是非守护线程,所以正常情况下使用的是非守护线程。当JVM里没有非守护线程时,JVM退出,代码如下:
![](https://epubservercos.yuewen.com/DAFF96/31397728807979506/epubprivate/OEBPS/Images/Figure-P21_18611.jpg?sign=1738831634-Q85smoLJBX6evOudsfz6pXS8dQ8fl23G-0-8f382d9e7f5e335c58de288b4dfd9c10)
SevenMain类主方法,代码如下:
![](https://epubservercos.yuewen.com/DAFF96/31397728807979506/epubprivate/OEBPS/Images/Figure-P22_18613.jpg?sign=1738831634-4LdE6IGLoU1Tq1skKRZsoENeYSioAPjG-0-c4bf3b4af6a1c192b0f7a0e8a70a3718)
执行结果如下:
main false
观察结果,可以看到并没有输出SevenThread线程对象中的内容,因为它已被设置为守护线程,需要等待5s才会输出内容,但是在此过程中唯一的非守护线程main很快执行完毕了,所以SevenThread线程对象还在睡眠的过程中,此时的JVM环境里全是守护线程,JVM退出,导致SevenThread线程对象直接被关闭了。
修改SevenMain类,代码如下:
![](https://epubservercos.yuewen.com/DAFF96/31397728807979506/epubprivate/OEBPS/Images/Figure-P22_18614.jpg?sign=1738831634-jfJJQPEU515TOVYBJomt2wyRyDqhf8Zo-0-f2947082618eead8f434f844fa24cfd4)
执行结果如下:
main false SevenThread:isDaemon=false
可以看到输出了SevenThread线程对象中的内容,因为此时它是非守护线程,JVM必须等待它执行完毕。