守护线程(Daemon Thread)
在 Java 中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)。
用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆。
只要当前 JVM 实例中还存在任何一个没有结束的非守护线程,守护线程就仍然工作。只有当最后一个非守护线程结束时,守护线程随着 JVM 一同结束而结束。 守护线程的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者。
用户线程和守护线程两者几乎没有区别,唯一的不同之处就在于是否导致 JVM 的结束:如果用户线程已经全部退出运行了,只剩下守护线程存在了,JVM 也就退出了。 因为没有被守护者了,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。
创建守护进程
值得一提的是,守护线程并非只有虚拟机内部提供,用户在编写程序时也可以自己设置守护线程。下面的方法就是用来设置守护线程的。
Thread daemonTread = new Thread();
// 设定 daemonThread 为 守护线程,default false(非守护线程)
daemonThread.setDaemon(true);
// 验证当前线程是否为守护线程,返回 true 则为守护线程
daemonThread.isDaemon();
这里有几点需要注意:
- IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。
- 在守护线程中产生的新线程也是守护线程的。
- 不要认为所有的应用都可以分配给守护线程来进行服务,比如读写操作或者计算逻辑。
当我们在Java程序中创建一个线程,它就被称为用户线程。一个守护线程是在后台执行并且不会阻止JVM终止的线程。当没有用户线程在运行的时候,JVM关闭程序并且退出。一个守护线程创建的子线程依然是守护线程。
Reference
- Java中守护线程的总结 - https://blog.csdn.net/shimiso/article/details/8964414
FEATURED TAGS
algorithm
algorithmproblem
architecturalpattern
architecture
aws
c#
cachesystem
codis
compile
concurrentcontrol
database
dataformat
datastructure
debug
design
designpattern
distributedsystem
django
docker
domain
engineering
freebsd
git
golang
grafana
hackintosh
hadoop
hardware
hexo
http
hugo
ios
iot
java
javaee
javascript
kafka
kubernetes
linux
linuxcommand
linuxio
lock
macos
markdown
microservices
mysql
nas
network
networkprogramming
nginx
node.js
npm
oop
openwrt
operatingsystem
padavan
performance
programming
prometheus
protobuf
python
redis
router
security
shell
software testing
spring
sql
systemdesign
truenas
ubuntu
vmware
vpn
windows
wmware
wordpress
xml
zookeeper