什么是守护线程
Java中的线程分为两类:用户线程(User Thread
)、守护线程(Daemon Thread
),守护线程有点类比于操作系统层面的守护进程
,而操作系统层面本身是没有守护线程的定义的,这个是JVM
定义出来的。守护线程是守护JVM中的其他线程,所以当如果其他线程不存在时,守护线程也会随之停止,意在伴随着JVM
的关闭也销毁,比如常说的GC线程。
看一个简单的例子
public class Main {
public static void main(String[] args) {
//守护线程
Thread daemonThread = new Thread(() -> {
for (int i = 0; i < 10; i++) {
System.out.println("daemon thread:" + i);
sleep();
}
});
daemonThread.setDaemon(true);
daemonThread.start();
//用户线程
new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("common thread:" + i);
sleep();
}
}).start();
//主线程
for (int i = 0; i < 2; i++) {
System.out.println("main thread:" + i);
sleep();
}
}
private static void sleep() {
try {
Thread.sleep(100L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
执行结果
daemon thread:0
main thread:0
common thread:0
main thread:1
daemon thread:1
common thread:1
common thread:2
daemon thread:2
daemon thread:3
common thread:3
common thread:4
daemon thread:4
1)主线程执行完了,普通子线程仍然在执行
2)普通子线程执行完了,守护线程也相继停止了
3)JVM退出不会Care守护线程是否接受
基本特性
1)所有用户线程结束后,JVM直接关闭,不会等待守护线程
2)setDaemon()
必须在start()
方法前调用,否者会报错
3)线程的daemon
属性默认继承于父线程,即守护线程创建出来的线程也是守护线程
4)和线程本身优先级没有关系,线程priority
和daemon
是两个独立的特性(看官方文档没有指出之间有什么联系)
使用场景
后台线程一般用于执行一些辅助型的后台任务:
- 典型的Java GC线程
- 手机系统监控信息
- 监听网络请求或者异步任务
网友评论