返回介绍

2.5 驻守后台:守护线程 Daemon

发布于 2024-08-21 22:20:21 字数 1266 浏览 0 评论 0 收藏 0

守护线程是一种特殊的线程,就和它的名字一样,它是系统的守护者,在后台默默地完成一些系统性的服务,比如垃圾回收线程、JIT线程就可以理解为守护线程。与之相对应的是用户线程,用户线程可以认为是系统的工作线程,它会完成这个程序应该要完成的业务操作。如果用户线程全部结束,这也意味着这个程序实际上无事可做了。守护线程要守护的对象已经不存在了,那么整个应用程序就自然应该结束。因此,当一个Java应用内,只有守护线程时,Java虚拟机就会自然退出。

下面简单地看一下守护线程的使用:

01 public class DaemonDemo {
02   public static class DaemonT extends Thread{
03     public void run(){
04       while(true){
05         System.out.println("I am alive");
06         try {
07           Thread.sleep(1000);
08         } catch (InterruptedException e) {
09           e.printStackTrace();
10         }
11       }
12     }
13   }
14   public static void main(String[] args) throws InterruptedException {
15     Thread t=new DaemonT();
16     t.setDaemon(true);
17     t.start();
18
19     Thread.sleep(2000);
20   }
21 }

上述代码第16行,将线程t设置为守护线程。这里注意,设置守护线程必须在线程start()之前设置,否则你会得到一个类似以下的异常,告诉你守护线程设置失败。但是你的程序和线程依然可以正常执行。只是被当做用户线程而已。因此,如果不小心忽略了下面的异常信息,你就很可能察觉不到这个错误。那你就会诧异为什么程序永远停不下来了呢?

Exception in thread "main" java.lang.IllegalThreadStateException
  at java.lang.Thread.setDaemon(Thread.java:1367)
  at geym.conc.ch2.daemon.DaemonDemo.main(DaemonDemo.java:20)

在这个例子中,由于t被设置为守护线程,系统中只有主线程main为用户线程,因此在main线程休眠2秒后退出时,整个程序也随之结束。但如果不把线程t设置为守护线程,main线程结束后,t线程还会不停地打印,永远不会结束。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文