在没有去了解Java守护线程是什么之前,大家是怎么猜测它的?反正我是这样以为的:
Java守护线程应该是一直运行在后台的后台线程。
结果发现我太天真了,今天简单介绍一下Java的守护线程。
Java守护线程
Java中的线程分为两类:
- 用户线程(非守护线程);
- 守护线程
在JVM中,守护线程(Deamon线程)的优先级是很低的,低于用户线程,他们的作用就是服务于用户线程(非守护线程,以后都称用户线程)。你可以把守护线程比喻为服务员,用户线程比喻为顾客,服务员都是围绕顾客存在的,所以如果JVM中所有的用户线程都停止了的话,守护线程也就没有可以服务的线程了,自然就没有存在的价值了,这时JVM将会退出。
只要JVM中存在至少一个用户线程,JVM就不会退出。
在Java中,可以使用如下的方式设置一个线程为守护线程:
Thread.setDeamon(true);
setDeamon
是线程类中的函数,使用这个函数可以将一个线程设置为守护线程,默认值为false。
有几点需要注意:
- 如果要设置一个线程为守护线程,必须在线程启动之前设置,如果线程已经启动了再设置该选项,将会报异常;
- 守护线程中新产生的线程也是守护线程;
- 一些必须要有结果的任务(比如写文件,计算数据)不应该分配个守护线程执行,因为它可能在某个时刻就随JVM一同退出了。
典型的守护线程
Java中的垃圾回收线程是一个典型的守护线程,它为其他用户线程回收垃圾而存在,假如用户线程全部都退出了,也就不会产生垃圾了,它也就没有必要存在了,这时JVM将退出,随之垃圾回收线程也就退出了。