在Java中,有两种类型的线程:

  • 守护进程线程
  • 用户线程

守护程序线程是始终在后台运行的低优先级线程,而用户线程是始终在前台运行的高优先级线程。 用户线程或非守护程序旨在执行特定或复杂的任务,其中守护程序线程用于执行支持任务。

Java中的守护程序线程和用户线程的区别

  • JVM不等待守护程序线程完成,但等待用户线程:守护程序和用户线程之间的首要区别是,JVM将不等待守护程序线程完成其任务,而是等待任何活动的用户线程。

  • 线程优先级:与守护程序线程相比,用户线程具有较高的优先级,这意味着它们不会像用户线程那样容易获得CPU。

  • 线程的创建:用户线程通常由应用程序创建,用于同时执行某些任务。另一方面,守护进程线程主要是由JVM创建的,就像一些垃圾回收作业一样。
  • 线程终止:如果所有用户线程均已完成执行,但用户线程被应用程序或自身关闭,则JVM将强制守护程序线程终止。用户线程可以继续通过JVM运行,而守护进程线程不能继续通过JVM运行。这是用户线程和守护程序线程之间最关键的区别。
  • 用法:守护程序线程不用于任何关键任务。任何重要的任务都由用户线程完成。守护程序线程通常用于某些非关键任务的后台任务。

用户线程和守护程序线程之间的主要区别:

用户线程 守护程序线
JVM等到用户线程完成工作。 在所有用户线程完成工作之前,它永远不会退出。 JVM不会等待守护程序线程完成其工作。 所有用户线程完成工作后,JVM将立即退出。
JVM不会强制用户线程终止,因此JVM将等待用户线程终止自身。 如果所有用户线程都已完成工作,则JVM将强制守护程序线程终止。
用户线程由应用程序创建。 通常是由JVM创建的守护程序线程。
主要是将用户线程设计为执行某些特定任务。 守护程序线程被设计为支持用户线程。
用户线程是前台线程。 守护程序线程是后台线程。
用户线程是高优先级线程。 守护程序线程是低优先级线程。
生命周期独立。 它的寿命取决于用户线程。

示例:检查线程是否为守护程序

可以使用setDaemon(boolean)方法将用户线程作为守护程序线程。 在此示例中,正在使用isDaemon()方法检查线程类型(用户线程或守护程序线程)。 如果它是守护程序,则返回true,否则返回false

// Java program check thread is Daemon or not 

class MyThread extends Thread { 

    @Override
    public void run() 
    { 
        System.out.println("User Thread or Non-Daemon Thread"); 
    } 
} 

class MainThread { 

    public static void main(String[] args) 
    { 

        MyThread mt = new MyThread(); 
        mt.start(); 

        System.out.println("Main Thread"); 

        System.out.println("Is " + mt.getName()  + " a Daemon Thread: " + mt.isDaemon()); 

        System.out.println("Is " + Thread.currentThread().getName()  + " a Daemon Thread: "
                           + Thread.currentThread().isDaemon()); 
    } 
}

运行结果如下:

Main Thread
Is Thread-0 a Daemon Thread: false
Is main a Daemon Thread: false
User Thread or Non-Daemon Thread

示例:将非守护程序线程设为守护程序线程:

在此示例中,使用setDeamon(boolean)将非守护程序线程作为守护程序。

// Java program make user thread as a daemon thread 

class MyThread extends Thread { 

    @Override
    public void run() 
    { 
        System.out.println("Non-Daemon thread"); 
    } 
} 

class MainThread { 

    public static void main(String[] args) 
    { 
        MyThread mt = new MyThread(); 
        System.out.println("Before using setDaemon() method: "); 
        System.out.println("Is " + mt.getName() 
                           + " a Daemon Thread: "
                           + mt.isDaemon()); 

        mt.setDaemon(true); 

        System.out.println("After using setDaemon() method: "); 
        System.out.println("Is " + mt.getName() 
                           + " a Daemon Thread: "
                           + mt.isDaemon()); 
    } 
}

运行结果如下:

Before using setDaemon() method: 
Is Thread-0 a Daemon Thread: false
After using setDaemon() method: 
Is Thread-0 a Daemon Thread: true
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果。
转载请注明:文章转载自 有区别网 [http://www.hasdiffer.com]
本文标题:Java的守护程序线程和用户线程的区别
本文链接:http://www.vsdiffer.com/daemon-threads-vs-user-threads-in-java.html
免责声明:本站部分内容除注明转载外,均为本站网站用户投稿或互联网整理。对于该内容的正确性如何,本站不负任何责任。同时,如本网站内容无意之中冒犯了您的权益,请联系站长,邮箱:1478761107#qq.com(使用@代替#),我们核实并会尽快处理。

相关主题

随机