上QQ阅读APP看书,第一时间看更新
1.7 守护线程
当JVM启动时,通常有一个非守护线程(通常指运行某个指定类的名为main的主方法)称为主线程。JVM继续运行,直到发生以下情况:
(1)已调用Runtime对象的退出方法,并且安全管理器已允许进行退出操作。
(2)所有不是守护线程的线程都已经被销毁。
1.获得当前线程对象是否为守护线程
可以通过Thread线程对象的isDaemon()方法获得此线程是否为守护线程。如果此线程是守护线程,则返回值为true,否则返回值为false。
2.设置当前线程对象是否为守护线程
可以通过Thread线程对象的setDaemon(boolean on)方法将此线程对象标记为守护线程或非守护线程,当所有执行的线程都是守护线程时,JVM退出。
在默认情况下创建线程对象时,会从当前执行线程对象中获得并初始化,如图1-9所示。
图1-9 初始化守护线程状态
当平时使用main(String[]args)主方法运行时,主方法的执行线程是非守护线程,所以正常情况下使用的是非守护线程。当JVM里没有非守护线程时,JVM退出,代码如下:
SevenMain类主方法,代码如下:
执行结果如下:
main false
观察结果,可以看到并没有输出SevenThread线程对象中的内容,因为它已被设置为守护线程,需要等待5s才会输出内容,但是在此过程中唯一的非守护线程main很快执行完毕了,所以SevenThread线程对象还在睡眠的过程中,此时的JVM环境里全是守护线程,JVM退出,导致SevenThread线程对象直接被关闭了。
修改SevenMain类,代码如下:
执行结果如下:
main false SevenThread:isDaemon=false
可以看到输出了SevenThread线程对象中的内容,因为此时它是非守护线程,JVM必须等待它执行完毕。