首页 > 编程笔记 > Java笔记 阅读:13

Java Thread.setDaemon():设置守护线程(附带实例)

一个 Java 程序启动时由主线程负责执行,主线程又会启动其他线程。要退出 Java 程序时,JVM 要求必须等待所有线程都执行结束后才能完全退出,否则将一直等待其他线程执行完毕。

有些线程的工作就是不断循环执行,比如通过 while(true) 来实现定时任务的执行,为了满足这种需求就提出了守护线程。守护线程会在 Java 程序运行结束时跟着退出。

分析下面的代码能执行完毕吗:
public class ThreadDaemonTest {
    public static void main(String[] args) {
       Thread t2 = new Thread(() -> {
           try {
               while (true) {
                   Thread.sleep(3000);
               }
           } catch (InterruptedException e) {
           }
       });
       t2.start();
       System.out.println("永远退出不了");
    }
}
实际上不能,线程 t2 会一直无限循环进入休眠状态,而主线程在输出“永远退出不了”后就一直在等待线程 t2,但是 t2 无法执行完毕,所以这个 Java 程序将永远无法结束。

将上面的例子稍微进行改造后就能让程序正常结束,也就是通过 setDaemon(true) 将线程 t2 设置为守护线程,代码如下所示:
public class ThreadDaemonTest {
    public static void main(String[] args) {
        Thread t2 = new Thread(() -> {
            try {
                while (true) {
                    Thread.sleep(3000);
                }
            } catch (InterruptedException e) {
            }
        });
        t2.setDaemon(true);
        t2.start();
        System.out.println("正常退出");
    }
}
此时主线程输出“正常退出”后就能正常结束,因为守护线程会跟着主线程的结束而结束。

相关文章