案例一:
/**
* 什么是守护线程?
* 当 JVM 中不存在任何一个正在运行的非守护线程时,则 JVM 进程即会退出。
* 如果 JVM 中没有一个正在运行的非守护线程,这个时候,JVM 会退出。换句话说,守护线程拥有自动结束自己生命周期的特性,而非守护线程不具备这个特点。
*
* 应用场景:
* JVM 中的垃圾回收线程就是典型的守护线程,如果说不具备该特性,会发生什么呢?
* 当 JVM 要退出时,由于垃圾回收线程还在运行着,导致程序无法退出,这就很尴尬了!!!由此可见,守护线程的重要性了。
* 通常来说,守护线程经常被用来执行一些后台任务,但是呢,你又希望在程序退出时,或者说 JVM 退出时,线程能够自动关闭,此时,守护线程是你的首选,这样jvm进程就能优雅的关闭
*
*/
public class DaemonThreadTest_2 extends Thread {
public static void main(String[] args) throws InterruptedException {
DaemonThreadTest_2 test = new DaemonThreadTest_2();
// 如果不设置daemon,那么线程将输出100后才结束,此处是将test设置为守护线程
test.setDaemon(true); //注意设置守护线程时要在线程启动之前,否则就会报异常
test.start();
System.out.println("isDaemon = " + test.isDaemon());
TimeUnit.SECONDS.sleep(1);
System.out.println("isDaemon test");
}
public void run() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
}
}
}
/**
* 如果test不设置为守护线程,当主线程main先执行完毕后,不会影响到test的打印,test线程会输出到99,
* 但是当test设置了守护线程,主线程main先执行完毕后,不管test执行是否完毕,都会退出
*/
案例二:
/**
* 线程里再开启一个线程,守护线程做测试
*/
public class DaemonThread2 {
public static void main(String[] args) throws InterruptedException {
//线程里再开启一个线程
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
Thread t2= new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10000);
System.out.println("t2完成");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t2.setDaemon(true); //启动一个守护线程,当t1结束,t2就结束,jvm进程就退出了,不会等待t2运行完毕才退出
t2.start();
try {
Thread.sleep(1000);
System.out.println("t1完成");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
}
}