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

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

Java 程序当中,可以把线程分为两类,分别为用户线程和守护线程,守护线程也叫后台线程:
在一些特定场合,经常会通过设置守护线程的方式来配合其他线程一起完成特定的功能,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次执行

用户通过键盘输入 y 或者 Y 时,程序将创建一个守护线程。主线程执行结束后守护线程也随之终止,此时在线程的 run() 方法中循环语句刚开始执行就结束了。这就说明守护线程随用户线程结束而结束。如果从键盘输入一个其他字符,则程序将创建一个用户线程,该用户线程不管主线程是否结束,都会一直执行下去,直到执行完毕。

相关文章