守护线程:
- 为所有⾮守护线程提供服务的线程
- 任何⼀个守护线程都是整个JVM中所有⾮守护线程的保姆
-
守护线程类似于整个进程的⼀个默默⽆闻的⼩喽喽
-
它的⽣死⽆关重要,它却依赖整个进程⽽运⾏
-
哪天其他线程结束了,没有要执⾏的了,程序就结束了,理都没理守护线程,就把它中断了
注意:
- 由于守护线程的终⽌是⾃身⽆法控制的,因此千万不要把IO、File等重要操作逻辑分配给它
-
因为它不靠谱
守护线程的作⽤是什么?
举例
GC垃圾回收线程:
就是⼀个经典的守护线程,当我们的程序中不再有任何运⾏的Thread,程序就
不会再产⽣垃圾,垃圾回收器也就⽆事可做,所以当垃圾回收线程是JVM上仅剩的线程时,垃圾回收线
程会⾃动离开。它始终在低级别的状态中运⾏,⽤于实时监控和管理系统中的可回收资源。
应⽤场景:
- 来为其它线程提供服务⽀持的情况
-
或者在任何情况下,程序结束时,这个线程必须正常且⽴刻关闭,就可以作为守护线程来使⽤
-
反之,如果⼀个正在执⾏某个操作的线程必须要正确地关闭掉否则就会出现不好的后果的话,那么这个线程就不能是守护线程,⽽是⽤户线程
-
通常都是些关键的事务,⽐⽅说,数据库录⼊或者更新,这些操作都是不能中断的。
thread.setDaemon(true)必须在thread.start()之前设置,否则会跑一个IllegalThreadStateException
异常。你不能把正在运⾏的常规线程设置为守护线程。
在Daemon线程中产⽣的新线程也是Daemon的。
守护线程不能⽤于去访问固有资源,⽐如读写操作或者计算逻辑。因为它会在任何时候甚⾄在⼀个操作 的中间发⽣中断。
Java⾃带的多线程框架,⽐如ExecutorService,会将守护线程转换为⽤户线程,所以如果要使⽤后台 线程就不能⽤Java的线程池。