本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接
问题
Java 中的守护线程是什么?
回答
回答 1
守护线程指为其他线程服务的线程,在 JVM 中,所有非守护线程都执行完毕后,无论有无后湖线程,虚拟机都会自动退出,最典型的一个案例就是垃圾回收。
我们可以使用 setDeamon(boolean) 方法在线程启动前更改 Thread 守护线程属性。
回答 2
还有一些值得需要注意的点:(参考)
- 创建新线程时,它将继承其父类的守护进程状态;
- 当所有非守护线程完成后,JVM 停止运行,然后剩余的守护线程都将被放弃;
基于上述原因,在使用守护线程时一定要谨慎,而且将守护线程用于任意类型的涉及 IO 的任务都是十分危险的。
回答 3
楼上的回答都讲的十分到位。以下举个小例子来说明其中的区别。我们尝试将 setDaemon(boolean) 方法中的参数设置为 true 和 false 来看它们的区别。
public class DaemonTest {
public static void main(String[] args) {
new WorkerThread().start();
try {
Thread.sleep(7500);
} catch (InterruptedException e) {
// 处理异常
}
System.out.println("Main Thread ending") ;
}
}
class WorkerThread extends Thread {
public WorkerThread() {
// 参数为 false, (假设此时无任何守护线程)
// WorkerThread 继续执行
// 参数为 true, (假设此时是一个守护线程),
// WorkerThread 会在 main 线程或者用户自定义线程(非守护线程)终止时而随之终止
setDaemon(true);
}
public void run() {
int count = 0;
while (true) {
System.out.println("Hello from Worker "+count++);
try {
sleep(5000);
} catch (InterruptedException e) {
// handle exception here
}
}
}
}
回答 4
传统意义上来讲,UNIX 中的守护线程一般是指那些在后台运行的线程,类似于 Windows 中的服务。
Java 中的守护线程指的是那些不会阻止 JVM 退出的线程。特别的,如果只剩下守护线程时,JVM 将退出。我们可以通过调用 Thread 中的 setDeamon() 方法来创建一个守护线程。
出处
文章翻译自 Stack Overflow:What is a daemon thread in Java?