有人能告诉我Java中的守护线程是什么吗?


当前回答

守护线程和用户线程。通常程序员创建的所有线程都是用户线程(除非你指定它为守护线程或者你的父线程是守护线程)。用户线程通常用于运行我们的程序代码。除非所有用户线程都终止,否则JVM不会终止。

其他回答

以上答案都是好的。下面是一个简单的小代码片段,以说明两者的区别。在setDaemon中分别尝试true和false值。

public class DaemonTest {
    
    public static void main(String[] args) {
        new WorkerThread().start();

        try {
            Thread.sleep(7500);
        } catch (InterruptedException e) {
            // handle here exception
        }

        System.out.println("Main Thread ending") ;
    }

}

class WorkerThread extends Thread {
    
    public WorkerThread() {
        // When false, (i.e. when it's a non daemon thread),
        // the WorkerThread continues to run.
        // When true, (i.e. when it's a daemon thread),
        // the WorkerThread terminates when the main 
        // thread or/and user defined thread(non daemon) terminates.
        setDaemon(true); 
    }
    
    public void run() {
        int count = 0;

        while (true) {
            System.out.println("Hello from Worker "+count++);

            try {
                sleep(5000);
            } catch (InterruptedException e) {
                // handle exception here
            }
        }
    }
}

守护线程是在后台执行一些任务的线程,比如处理请求或应用程序中可能存在的各种chronjob。

当你的程序只剩下守护线程时,它将退出。这是因为这些线程通常与普通线程一起工作,并提供事件的后台处理。

你可以使用setDaemon方法指定一个线程是守护线程,它们通常不会退出,也不会被中断。当应用程序停止时,它们就会停止。

守护线程和用户线程。通常程序员创建的所有线程都是用户线程(除非你指定它为守护线程或者你的父线程是守护线程)。用户线程通常用于运行我们的程序代码。除非所有用户线程都终止,否则JVM不会终止。

守护线程类似于助手线程。非daemon线程就像前面的表演者。助手帮助表演者完成一项工作。工作完成后,执行者不再需要帮助来执行。由于不需要帮助,助手们离开了这个地方。因此,当非守护线程的任务结束时,守护线程就会离开。

当最后一个非守护进程线程执行完成时,JVM将完成这项工作。默认情况下,JVM将创建一个线程作为非守护进程,但我们可以通过setDaemon(true)方法将线程创建为守护进程。Daemon线程的一个很好的例子是GC线程,它将在所有非Daemon线程完成后立即完成它的工作。