理论教育 Java程序设计:守护线程实现

Java程序设计:守护线程实现

时间:2023-10-18 理论教育 版权反馈
【摘要】:当所有线程运行结束后,程序执行完毕,JVM退出。一般情况下,线程分为用户线程和守护线程。守护线程是指为其他线程服务的线程。当参数on的取值为true时,这个线程被标记为守护线程。在main线程中创建MyThread线程的实例daemonThread,将这个线程设置为守护线程。图12.16程序运行结果从图12.16的运行结果可以看出,守护线程在被启动之后每隔100毫秒就会输出“守护线程正在执行!”,且输出的语句是写在while{}无限循环中的。

Java程序设计:守护线程实现

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退出,因此守护线程也不会再执行。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈