Java setDaemon()设置守护线程(附带实例)
Java 中有一种线程,它是在后台运行的,主要任务就是为其他线程提供服务,这种线程被称为后台线程或守护线程。JVM 的垃圾回收机制使用的就是后台线程。
守护线程有一个重要的特征,如果所有的前台线程都死亡,后台线程会自动死亡。
调用 Thread 类的 setDaemon(true) 方法可以将指定的线程设置为后台线程,所有的前台线程都死亡的时候,后台线程就会自动死亡。
Thread 类还提供了一个 isDaemon() 方法,该方法主要是用于判断一个线程是否是一个后台线程。
接下来,通过案例来演示守护线程的使用。
通过运行结果可以发现,MyThread2 线程本应该执行循环 100 次,但是结果只执行 19 次就结束了,这是因为前台线程执行完毕后,线程死亡,只剩下后台线程,当线程只剩下后台线程的时候程序就没有执行的必要了,所以后台线程也会随之退出。
守护线程有一个重要的特征,如果所有的前台线程都死亡,后台线程会自动死亡。
调用 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
通过运行结果可以发现,MyThread2 线程本应该执行循环 100 次,但是结果只执行 19 次就结束了,这是因为前台线程执行完毕后,线程死亡,只剩下后台线程,当线程只剩下后台线程的时候程序就没有执行的必要了,所以后台线程也会随之退出。
注意,setDaemon(true) 必须在 start() 方法之前调用,否则会引发异常。