📜  Java多线程-守护程序线程

📅  最后修改于: 2020-09-27 01:20:23             🧑  作者: Mango

Java中的守护程序线程

Java中的守护程序线程是服务提供者线程,它为用户线程提供服务。它的寿命取决于用户线程的摆布,即当所有用户线程死亡时,JVM会自动终止该线程。

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

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

Java守护程序线程要记住的要点

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

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

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

线程类的Java Daemon线程方法

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

No. Method Description
1) public void setDaemon(boolean status) is used to mark the current thread as daemon thread or user thread.
2) public boolean isDaemon() is used to check that current is daemon.

Java中Daemon线程的简单示例

文件:MyThread.java

public class TestDaemonThread1 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){
  TestDaemonThread1 t1=new TestDaemonThread1();//creating thread
  TestDaemonThread1 t2=new TestDaemonThread1();
  TestDaemonThread1 t3=new TestDaemonThread1();

  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。

文件:MyThread.java

class TestDaemonThread2 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){
  TestDaemonThread2 t1=new TestDaemonThread2();
  TestDaemonThread2 t2=new TestDaemonThread2();
  t1.start();
  t1.setDaemon(true);//will throw exception here
  t2.start();
 }
}

Output:exception in thread main: java.lang.IllegalThreadStateException