何为Daemon线程?
Daemon----精灵,天使?
解释这个问题之前先说清楚
Java的线程分为两类----用户线程/Daemon线程
用户线程:
用户线程可以简单地理解为用户自定义的线程,包括main线程
main线程其实不是一个daemon线程
举例:main线程中创建一个用户线程,然后print日志,我们发现main结束了,线程仍然在运行,所以说明了main不是一个守护进程
Daemon线程(守护线程):
Daemon线程是为我们创建的用户线程提供服务的线程,比如说JVM的垃圾回收线程等等,这样的线程有一个非常明显的特征:当用户线程运行结束的时候,daemon线程就会自动退出。
特点:
A、守护线程创建的时候需要先调用setDaemon()进行设置,然后再启动线程。
B、由于Daemon线程的终止条件是当前是否存在用户线程,所以我们不能指派Daemon线程来进行一些业务操作,而只能服务用户线程
C、Daemon线程创建的子线程任然是Daemon线程
基于其特点,我们可以知道,这样的线程并不是用户线程不可或缺的部分,只是用于提供服务的“服务线程”。所以,虚拟机中的用户线程全部退出运行时,守护线程失去了服务的对象,JVM也就退出了。
记住一句话:线程中只剩下守护线程时,JVM就会退出。如果有任意一个线程存在,JVM就不会退出。
import java.util.Scanner;
public class DaemonRunner implements Runnable {
public void run() {
while (true) {
for (int i = 1; i <= 100; i++) {
System.out.println("守护线程:"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
Thread daemonThread = new Thread(new DaemonRunner());
// 设置为守护进程
daemonThread.setDaemon(true);
daemonThread.start();
System.out.println("isDaemon = " + daemonThread.isDaemon());
Scanner sc = new Scanner(System.in);
// 接受输入,使程序在此停顿,一旦接受到用户输入,main线程结束,JVM退出!
sc.next();
//AddShutdownHook方法增加JVM停止时要做处理事件:
//当JVM退出时,打印JVM Exit语句.
Runtime.getRuntime().addShutdownHook(new Thread(){
public void run() {
System.out.println("JVM has been Exited");
}
});
}
}
自定义守护进程的方法:
在Thread.start()方法之前使用setDaemon(true)方法
通过此方法将Thread类中的boolean daemon=true;
JVM就会将该线程归为守护线程。