协慌网

登录 贡献 社区

什么是 Java 中的守护程序线程?

任何人都能告诉我 Java 中的守护程序线程是什么吗?

答案

守护程序线程是一个线程,它不会阻止 JVM 在程序完成但程序仍在运行时退出。守护程序线程的一个示例是垃圾回收。

您可以使用setDaemon(boolean)方法在线程启动之前更改Thread守护程序属性。

还有几点(参考: Java Concurrency in Practice

  • 创建新线程时,它会继承其父级的守护程序状态。
  • 当所有非守护程序线程完成时,JVM 将停止,并且任何剩余的守护程序线程都将被放弃

    • 最后块没有被执行
    • 堆栈没有解开 - JVM 刚刚退出。

    由于这个原因,应该谨慎使用守护程序线程,并且将它们用于可能执行任何类型的 I / O 的任务是危险的。

以上所有答案都很好。这是一个简单的小代码片段,用于说明差异。尝试使用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 user thread),
        // the Worker thread continues to run.
        // When true, (i.e. when it's a daemon thread),
        // the Worker thread terminates when the main 
        // thread 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
            }
        }
    }
}