当前位置: 首页 > 教程 > Java多线程 >

Java 守护线程

精华
小牛编辑
118浏览
2023-03-14

1 什么是Java 守护线程

Java中的守护程序线程是一个服务提供者线程,向用户线程提供服务。它的寿命受到用户线程的控制,即当所有用户线程死亡时,JVM会自动终止该线程。

有许多自动运行的Java守护程序线程,例如gc,finalizer等。

您可以通过在cmd命令提示符下键入jconsole来查看所有详细信息。jconsole工具提供有关已加载类,内存使用情况,正在运行的线程等的信息。

2 Java 守护线程的要点

  • 守护线程为后台支持任务的用户线程提供服务。除了为用户线程服务之外,没有任何作用。
  • 守护线程的寿命取决于用户线程。
  • 守护线程是低优先级线程。

问题:如果没有用户线程,为什么JVM终止守护程序线程?

答案:守护程序线程的唯一目的是为后台线程提供服务给用户线程。如果没有用户线程,那么JVM为什么要继续运行该线程。这就是为什么JVM在没有用户线程的情况下终止守护程序线程的原因。

3 Thread类的守护线程方法

java.lang.Thread类为Java守护程序线程提供了两种方法。

方法 描述
public void setDaemon(boolean status) 用于将当前线程标记为守护程序线程或用户线程。
public boolean isDaemon() 用于判断current是否是守护程序。

3 Java 守护线程的例子

package cn.xnip;

/**
 * 小牛知识库网: https://www.xnip.cn
 */
/**
 *  Java 守护线程的例子
 */
public class Demo extends Thread{

    public void run(){
        if(Thread.currentThread().isDaemon()){//checking for daemon thread
            System.out.println("daemon thread work");
        }
        else{
            System.out.println("user thread work");
        }
    }
    public static void main(String[] args){
        Demo t1=new Demo();//creating thread
        Demo t2=new Demo();
        Demo t3=new Demo();

        t1.setDaemon(true);//now t1 is daemon thread

        t1.start();//starting threads
        t2.start();
        t3.start();
    }
}

输出结果为:

daemon thread work
user thread work
user thread work

注意:如果要将用户线程设置为守护程序,则必须启动它,否则将引发IllegalThreadStateException异常。如下所示:

package cn.xnip;

/**
 * 小牛知识库网: https://www.xnip.cn
 */
/**
 *  Java 守护线程错误示范
 */
class Demo extends Thread{
    public void run(){
        System.out.println("Name: "+Thread.currentThread().getName());
        System.out.println("Daemon: "+Thread.currentThread().isDaemon());
    }

    public static void main(String[] args){
        Demo t1=new Demo();
        Demo t2=new Demo();
        t1.start();
        t1.setDaemon(true);//will throw exception here
        t2.start();
    }
}

输出结果为:

Exception in thread "main" java.lang.IllegalThreadStateException
	at java.lang.Thread.setDaemon(Thread.java:1352)
	at cn.xnip.Demo.main(Demo.java:19)
Name: Thread-0
Daemon: false