• Tags
  •         
  • www.breakyizhan.com
  •    

    守护程序线程是一个低优先级的线程,它在后台运行以执行垃圾回收等任务。

    Java中的守护程序线程Daemon属性

    • 当所有用户线程完成执行时,它们无法阻止JVM退出。
    • 当所有用户线程完成执行时,JVM会自行终止
    • 如果JVM发现正在运行的守护程序线程,它将终止该线程并在该自身关闭之后终止。JVM不关心守护程序线程是否正在运行。
    • 这是一个极低优先级的线程。

    Java中的守护程序线程Daemon方法

    1. void setDaemon(boolean status):此方法用于将当前线程标记为守护程序线程或用户线程。例如,如果我有一个用户线程tU,那么tU.setDaemon(true)会使它成为守护进程线程。另一方面,如果我有一个守护程序线程tD,那么通过调用tD.setDaemon(false)将使它成为用户线程。
      句法:

      public final void setDaemon(boolean on)
      parameters:
       on: if true,将此线程标记为守护程序线程。
      异常:
      IllegalThreadStateException:如果只有这个线程是活动的。
      SecurityException:如果当前线程无法修改此线程。
    2. boolean isDaemon():
      此方法用于检查当前是守护进程。如果线程是守护进程,则返回true,否则返回false。
      句法:

      public final boolean isDaemon()
      返回: 
      如果此线程是守护程序线程,则此方法返回true; 
      否则是假的
      // Java program to demonstrate the usage of
      // setDaemon() and isDaemon() method.
      public class DaemonThread extends Thread
      {
          public DaemonThread(String name){
              super(name);
          }
      
          public void run()
          {
              // Checking whether the thread is Daemon or not
              if(Thread.currentThread().isDaemon())
              {
                  System.out.println(getName() + " is Daemon thread"); 
              }
              
              else
              {
                  System.out.println(getName() + " is User thread");
              }
          }
          
          public static void main(String[] args)
          {
          
              DaemonThread t1 = new DaemonThread("t1");
              DaemonThread t2 = new DaemonThread("t2");
              DaemonThread t3 = new DaemonThread("t3");
          
              // Setting user thread t1 to Daemon
              t1.setDaemon(true);
                  
              // starting first 2 threads
              t1.start();
              t2.start();
      
              // Setting user thread t3 to Daemon
              t3.setDaemon(true);
              t3.start();       
          }
      }
      

      输出:

      t1 is Daemon thread
      t2 is User thread

    守护程序线程中的异常

    如果在启动线程后调用setDaemon()方法,则会抛出IllegalThreadStateException

    // Java program to demonstrate the usage of
    // exception in Daemon() Thread
    public class DaemonThread extends Thread
    {
        public void run()
        {
            System.out.println("Thread name: " + Thread.currentThread().getName());
            System.out.println("Check if its DaemonThread: "
                            + Thread.currentThread().isDaemon());
        }
    
        public static void main(String[] args)
        {
            DaemonThread t1 = new DaemonThread();
            DaemonThread t2 = new DaemonThread();
            t1.start();
            
            // Exception as the thread is already started
            t1.setDaemon(true);
            
            t2.start();
        }
    }
    

    运行时异常:

    Exception in thread "main" java.lang.IllegalThreadStateException
        at java.lang.Thread.setDaemon(Thread.java:1352)
        at DaemonThread.main(DaemonThread.java:19)

    输出:

    Thread name: Thread-0
    Check if its DaemonThread: false

    这清楚地表明我们在启动线程后无法调用setDaemon()方法。

    守护进程与用户线程

    1. 优先级:当进程中唯一剩余的线程是守护程序线程时,解释器退出。这是有道理的,因为当只剩下守护程序线程时,没有其他线程可供守护程序线程提供服务。
    2. 用法:守护进程线程是为用户线程提供后台支持任务的服务。

     

     

     
    转载请保留页面地址:https://www.breakyizhan.com/java/4976.html