Java setDaemon():设置守护线程(附带实例)
Java 程序当中,可以把线程分为两类,分别为用户线程和守护线程,守护线程也叫后台线程:
在一些特定场合,经常会通过设置守护线程的方式来配合其他线程一起完成特定的功能,JVM 的垃圾回收线程就是典型的守护线程。
守护线程依赖于创建它的线程,而用户线程则不依赖。举个简单的例子:如果在 main 线程中创建了一个守护线程,当 main() 方法运行完毕之后,守护线程也会随着消亡。而用户线程则不会,用户线程会一直运行直到其运行完毕。
可以通过调用 setDaemon(true) 方法将一个线程设置为守护线程,但不能把正在运行的用户线程设置为守护线程。
【实例】在主线程中创建一个子线程,子线程负责输出 5 行信息。如果把子线程设置成用户线程,则当主线程终止时,子线程会继续运行直到结束,如果把子线程设置为守护线程,则当主线程终止时,守护线程也会随主线程自动终止。
如果输入的是其他字符串,程序运行结果为:
- 用户线程也就是前面所说的一般线程,它负责处理具体的业务;
- 守护线程往往为其他线程提供服务,这类线程可以监视其他线程的运行情况,也可以处理一些相对不太紧急的任务。
在一些特定场合,经常会通过设置守护线程的方式来配合其他线程一起完成特定的功能,JVM 的垃圾回收线程就是典型的守护线程。
守护线程依赖于创建它的线程,而用户线程则不依赖。举个简单的例子:如果在 main 线程中创建了一个守护线程,当 main() 方法运行完毕之后,守护线程也会随着消亡。而用户线程则不会,用户线程会一直运行直到其运行完毕。
可以通过调用 setDaemon(true) 方法将一个线程设置为守护线程,但不能把正在运行的用户线程设置为守护线程。
【实例】在主线程中创建一个子线程,子线程负责输出 5 行信息。如果把子线程设置成用户线程,则当主线程终止时,子线程会继续运行直到结束,如果把子线程设置为守护线程,则当主线程终止时,守护线程也会随主线程自动终止。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ThreadDaemon implements Runnable { public void run() { for (int i = 1; i < 6; i++) { // 输出当前线程是否为守护线程 System.out.println("第 " + i + " 次执行 "); } } public static void main(String[] args) throws IOException { System.out.println("线程是守护线程 Y | N :"); // 输出提示信息 // 建立缓冲字符流 BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); String str; str = stdin.readLine(); // 从键盘读取一个字符串 ThreadDaemon td = new ThreadDaemon(); // 创建 ThreadDaemon 对象 Thread th = new Thread(td); // 创建线程对象 if (str.equals("Y") || str.equals("y")) { th.setDaemon(true); // 设置该线程为守护线程 } th.start(); // 启动线程 System.out.println("主线程即将结束!"); } }如果输入 y 或 Y,程序运行结果为:
线程是守护线程 Y | N :
y
主线程即将结束!
第1次执行
如果输入的是其他字符串,程序运行结果为:
线程是守护线程 Y | N :
n
主线程即将结束!
第1次执行
第2次执行
第3次执行
第4次执行
第5次执行