Java并发--守护线程(Daemon Thread)

Daemon线程

在Java中有两种线程:

  • 用户线程(User Thread)
  • 守护线程(Daemon Thread)

Daemon线程是一种支持型线程,因为它主要被用于程序中后台调度以及支持性工作。这意味着,当一个Java虚拟机中不存在非Daemon线程的时候,Java虚拟机将会退出。

  • 可以通过调用线程实例的setDaemon(true)将线程设置为Daemon线程。
  • 可以通过调用线程实例的isDaemon()方法,判断是否为Daemon线程,返回值为boolean。

注意:Daemon属性需要在启动线程之前设置,不能再启动线程之后设置。

Daemon线程被用作完成支持性工作,但是在Java虚拟机退出时,Daemon线程中的finally块不一定会执行,如下所示:

public class Daemon {
    public static void main(String[] args) {
        Thread thread = new Thread(new DaemonRunner(), "DaemonRunner");
        thread.setDaemon(true);
        thread.start();
    }

    static class DaemonRunner implements Runnable{

        @Override
        public void run() {
            try{
                SleepUtils.second(10);
            }finally {
                System.out.println("DaemonThread finally run.");
            }
        }
    }
}

运行Daemon程序,可以看到在终端没有任何输出。
main线程启动了Daemon线程,在启动之后随着main方法执行完毕而终止,而Java虚拟机中已经没有非Daemon线程,虚拟机需要退出。

Java虚拟机中的所有Daemon线程都需要立即终止,因此DaemonRunner立即终止,但是DaemonRunner中的finally块并没有执行。

所以:在构建Daemon线程时,不能依靠finally块中的内容来确保执行关闭或清理资源逻辑。

发布了616 篇原创文章 · 获赞 1840 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/cold___play/article/details/103997506