16.4.2 后台线程
什么是后台线程
后台线程(Daemon Thread
),是在后台运行的一种线程,后台线程主要用来向其他的线程提供服务。JVM
的垃圾回收线程就是典型的后台线程。
后台线程特征
后台线程有个特征:如果所有的前台线程都死亡,后台线程会自动死亡。
如何把一个线程设置成后台线程
调用Thread
对象的setDaemon(true)
方法可将指定线程设置成后台线程。
程序示例
1 | public class DaemonThread extends Thread |
下面程序将执行线程设置成后台线程,可以看到:
当所有的前台线程死亡时,后台线程随之死亡。当整个虚拟机中只剩下后台线程时,程序就没有继续运行的必要了,所以虚拟机也就退出了。
1 | main 0 |
上面程序中先将t
线程设置成后台线程,然后启动该线程,本来该线程应该执行到循环变量i
等于999
时才会结束,
但运行该程序时不难发现该后台线程无法运行到循环变量i
等于999
时,因为程序中唯一的前台线程(main
线程)运行结束后,JVM
会主动退出,因而后台线程也就被结束了。
如何判断一个线程是否是后台线程
Thread
类还提供了一个isDaemon()
方法,用于判断指定线程是否为后台线程。
从上面程序可以看出:
前后台的默认情况
- 主线程默认是前台线程,
- 前台线程创建的子线程默认是前台线程,
- 后台线程创建的子线程默认是后台线程。
后台线程死亡需要一定之间
当所有的前台线程死亡后,JVM
会给后台线程发出死亡通知,但后台线程从接收死亡通知到真正死亡,需要一定时间。
要先设置为后台线程再启动线程
要将某个线程设置为后台线程,必须在该线程启动之前设置,也就是说,setDaemon(true)
必须在star()
方法之前调用,否则会引发IllegalThreadStateException
异常。
原文链接: 16.4.2 后台线程