Java Thread.setDaemon():设置守护线程(附带实例)
一个 Java 程序启动时由主线程负责执行,主线程又会启动其他线程。要退出 Java 程序时,JVM 要求必须等待所有线程都执行结束后才能完全退出,否则将一直等待其他线程执行完毕。
有些线程的工作就是不断循环执行,比如通过 while(true) 来实现定时任务的执行,为了满足这种需求就提出了守护线程。守护线程会在 Java 程序运行结束时跟着退出。
分析下面的代码能执行完毕吗:
将上面的例子稍微进行改造后就能让程序正常结束,也就是通过 setDaemon(true) 将线程 t2 设置为守护线程,代码如下所示:
有些线程的工作就是不断循环执行,比如通过 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("正常退出"); } }此时主线程输出“正常退出”后就能正常结束,因为守护线程会跟着主线程的结束而结束。