守护线程

java将线程分为两类: User Thread(用户线程), Daemon Thread(守护线程)
简单的说,任何一个守护线程都是JVM中其他用户线程的保姆,只要JVM中尚有一个用户线程在运行,守护线程就全部工作,只有当用户线程结束时,守护线程随着JVM结束工作
最典型的JVM守护线程是GC,它始终以低级别的状态运行于后台,不会干扰JVM的运行,随着JVM的结束而结束,是一个很称职的守护者。

设置守护线程

java将用户线程设置为守护线程,可以使用如下方式

Thread daemonTread = new Thread();
daemonThread.setDaemon(true);

注意

  1. setDaemoon(true) 必须在线程start之前,否则会报IllegalThreadStateException错误。
  2. 守护线程内产生的守护线程也是守护线程
  3. 守护线程是以低级别的状态运行的,所以并非所有的操作放在守护线程中都合适,比如读写操作和计算逻辑,因为在用户线程退出时,守护线程也会跟着退出,那么守护线程内的操作可能不会照着预期的服务任务执行结束,这样会导致读写操作没来得及写入或者读出,计算结果可能每次都不一致,这对于程序的运行可能会造成毁灭性的的结果。

守护线程的运用

那么守护线程的作用是什么呢? 我们知道一个JVM虚拟机可以执行多个程序,比如tomcat,可以运行多个web服务,对于静态变量来说,生命周期是ClassLoader级别的,会随着web服务的停止而销毁。但是用户线程是JVM级别的,它并不会随着创建线程的停止而停止,它的运行是独立于web服务的,因此当tomcat关闭某一个web服务时,如果没有明确代码停止正在运行的所有线程,线程不会随着服务的停止而停止,一次很多有经验的开发者不提倡私自创建一个独立线程。
正是由于这个问题,为了防止在web服务停止时无法关闭线程,在某些可以设置为后台运行的操作,将其设置为低级别运行的守护线程是正确的选择!