Java程序入口是main()方法,可以理解为Java程序的主线程(main线程)是由JVM自动启动的,而main线程又可以启动其他线程。当所有线程运行结束后,程序执行完毕,JVM退出。如果有任意一个线程没有结束,JVM都不会退出。
然而,有的时候会需要一种线程来执行无限循环任务,例如定时输出当前时间:
上述代码中的线程将执行一个无限循环的任务,这种情况下,只要这个线程不结束,JVM进程就无法结束。那么JVM何时才能结束运行?这类线程又应该由谁负责来结束?就像操作系统一样,系统在运行过程中一直在等待新的指令或任务,但是当我们不需要用计算机并想关闭计算机时,应该如何来结束这个接收指令的线程?这时就需要用到守护线程。
一般情况下,线程分为用户线程(User Thread)和守护线程(Daemon Thread)。守护线程是指为其他线程服务的线程。在JVM中,如果所有非守护线程都执行完毕后,无论有没有守护线程,虚拟机都会自动退出。也就是说,可以将一些辅助线程、用来执行无限循环任务的线程设置为守护线程,当其他任务执行完毕之后,JVM会退出,这些线程也就自动关闭了。
将某个线程设置为守护线程需要用到Thread类的setDaemon()方法,该方法的描述如下:
从JDK API中的描述可以看出,如果Java虚拟机中运行的线程只有守护线程时,JVM会退出。setDaemon()方法可以用于标记一个线程是守护线程还是用户线程,且这个方法必须在线程启动前调用。当参数on的取值为true时,这个线程被标记为守护线程。如果调用setDaemon()方法时,线程已经启动,那么将抛出IllegalThreadStateException。
使用方式如:
Thread t = new MyThread();(www.daowen.com)
t.setDaemon(true);
t.start();
【例12.9】创建一个自定义线程MyThread,该线程无限循环输出内容。在main线程中创建MyThread线程的实例daemonThread,将这个线程设置为守护线程。然后main线程执行5次输出后退出,查看守护线程运行状态以及控制台输出。
在cn.pzhu.op包下创建一个名为ThreadDaemon的类,关键代码如下:
运行上述代码,程序运行结果如图12.16所示。
图12.16 程序运行结果
从图12.16的运行结果可以看出,守护线程在被启动之后每隔100毫秒就会输出“守护线程正在执行!”,且输出的语句是写在while(true){}无限循环中的。当线程mian执行了5次之后,主线程退出,这时所有非守护线程全部执行完毕,JVM退出,因此守护线程也不会再执行。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。