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

Java setDaemon()设置守护线程(附带实例)

Java 中有一种线程,它是在后台运行的,主要任务就是为其他线程提供服务,这种线程被称为后台线程或守护线程。JVM 的垃圾回收机制使用的就是后台线程。

守护线程有一个重要的特征,如果所有的前台线程都死亡,后台线程会自动死亡。

调用 Thread 类的 setDaemon(true) 方法可以将指定的线程设置为后台线程,所有的前台线程都死亡的时候,后台线程就会自动死亡。

Thread 类还提供了一个 isDaemon() 方法,该方法主要是用于判断一个线程是否是一个后台线程。

接下来,通过案例来演示守护线程的使用。
public class Demo {
    public static void main(String[] args) {
        // 创建MyThread1类实例
        System.out.println("青年学子梁山伯辞家求学,路上偶遇女扮男装的学子祝英台,");
        System.out.println("两人一见如故,志趣相投,遂于草桥结拜为兄弟。");
        MyThread1 myThread1 = new MyThread1("梁山伯"); // 开启线程
        myThread1.start();
        MyThread2 myThread2 = new MyThread2("祝英台"); // 开启线程
        myThread2.setDaemon(true); // 设置为后台线程
        myThread2.start();
    }
}

class MyThread1 extends Thread {
    private String socialStatus;
    public MyThread1(String socialStatus) {
        this.socialStatus = socialStatus;
    }
    @Override
    public void run() {
        for (int i = 1; i <= 20; i++) {
            System.out.println(socialStatus + i);
        }
    }
}

class MyThread2 extends Thread {
    private String socialStatus;
    public MyThread2(String socialStatus) {
        this.socialStatus = socialStatus;
    }
    @Override
    public void run() {
        for (int i = 1; i <= 100; i++) {
            System.out.println(socialStatus + i);
        }
    }
}
程序的运行结果如下:

青年学子梁山伯辞家求学,路上偶遇女扮男装的学子祝英台,
两人一见如故,志趣相投,遂于草桥结拜为兄弟。
梁山伯:1
梁山伯:2
祝英台:1
梁山伯:3
梁山伯:4
梁山伯:5
梁山伯:6
梁山伯:7
梁山伯:8
梁山伯:9
梁山伯:10
祝英台:2
梁山伯:11
祝英台:3
梁山伯:12
梁山伯:13
梁山伯:14
梁山伯:15
祝英台:4
梁山伯:16
祝英台:5
梁山伯:17
祝英台:6
祝英台:7
祝英台:8
祝英台:9
祝英台:10
梁山伯:18
梁山伯:19
祝英台:11
梁山伯:20
祝英台:12
祝英台:13
祝英台:14
祝英台:15
祝英台:16
祝英台:17
祝英台:18
祝英台:19

程序中,MyThread1 与 MyThread2 类继承了 Thread 类并且实现了 run() 方法,MyThread1 中的 run() 方法调用 20 次循环,MyThread2 中的 run() 方法调用 100 次循环。Demo 类 main() 方法中分别创建 MyThread1 与 MyThread2 的实例,MyThread2 的对象调用 setDaemon(true),此时该线程被设置为后台线程。

通过运行结果可以发现,MyThread2 线程本应该执行循环 100 次,但是结果只执行 19 次就结束了,这是因为前台线程执行完毕后,线程死亡,只剩下后台线程,当线程只剩下后台线程的时候程序就没有执行的必要了,所以后台线程也会随之退出。

注意,setDaemon(true) 必须在 start() 方法之前调用,否则会引发异常。

相关文章