Java中的守护程序线程Daemon

作者: Arvin Chen 分类: Java 来源: Break易站(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. 用法:守护进程线程是为用户线程提供后台支持任务的服务。

 

 

  •   本文标题:Java中的守护程序线程Daemon - Break易站
    转载请保留页面地址:https://www.breakyizhan.com/java/4976.html
    扫描二维码添加微信 
  • ,领取淘宝优惠券,淘宝购物更优惠。现在添加微信,还可以领取机械键盘优惠券!添加微信后,分享淘宝选中的机械键盘给淘宝机器人即可领取!
    支持我们,就用微信淘宝!

    发表笔记

    电子邮件地址不会被公开。 必填项已用*标注

    更多阅读