首页 > 编程笔记 > Java笔记 阅读:25

Java Thread类的setDaemon()方法(附带实例)

一般来说,Java 虚拟机中一般包括两种线程,分别是用户线程和后台线程。

所谓的后台线程指的是程序运行时在后台提供的一种通用服务的线程,也就是为其他线程提供服务的线程,也称守护线程。

后台线程并不属于程序中不可或缺的部分。因此,当所有的非后台线程结束时,也就是用户线程都结束时,程序也就终止了,同时会杀死进程中所有的后台线程。

反过来说,只要有任何非后台线程还在运行,程序就不会结束。例如,执行main()方法的就是一个非后台线程。基于这个特点,当虚拟机中的用户线程全部退出运行时,后台线程没有服务的对象后,Java虚拟机也就会退出。

由于后台线程主要用于为系统中的其他对象和线程提供服务,因此它的优先级比较低。垃圾回收线程就是一个经典的守护线程,当程序中不再有任何运行的用户线程时,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以,当垃圾回收线程是 Java 虚拟机上仅剩的线程时,垃圾回收线程会自动退出。垃圾回收线程始终在低级别的状态下运行,用于实时监控和管理系统中的可回收资源。

将一个用户线程设置为后台线程的方式是在线程对象创建之前使用线程对象的 setDaemon() 方法。通过setDaemon(true)来设置线程为后台线程。

setDaemon() 方法必须在 start() 方法之前设定,否则会抛出 IllegalThreadStateException 异常。可以使用 isDaemon() 方法判断一个线程是前台线程还是后台线程。

【实例】后台线程的应用。
public class Example {
    public static void main(String[] args) {
        // 声明子线程执行逻辑并创建线程对象
        Thread daemonThread = new Thread(new Runnable() {
            public void run() {
                try {
                    while (true) {
                        System.out.println(Thread.currentThread().getName());
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                } catch (Exception e) {
                    System.out.println("Exception");
                }
            }
        });
        // 设置子线程为后台线程
        daemonThread.setDaemon(true);
        // 启动子线程
        daemonThread.start();
        // 主线程的输出信息
        for (int i = 0; i < 2; i++) {
            System.out.println(Thread.currentThread().getName());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("end main");
    }
}
运行结果为(一部分):

main
Thread-0
main
Thread-0
Thread-0
end main

上面的程序先将 daemonThread 线程设置成后台线程,再启动后台线程。在该线程中并没有线程退出的代码,但运行程序时发现该后台线程无法一直运行,因为当主线程结束后,Java 虚拟机会自动退出,所以后台线程也就结束了。

相关文章