`
whoosh
  • 浏览: 234917 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Java中User Thread和Daemon Thread的区别

阅读更多
Java将线程分为User线程和Daemon线程两种。通常Daemon线程用来为User线程提供某些服务。程序的main()方法线程是一个User进程。User进程创建的进程为User进程。当所有的User线程结束后,JVM才会结束。
通过在一个线程对象上调用setDaemon(true),可以将user线程创建的线程明确地设置成Daemon线程。例如,时钟处理线程、idle线程、垃圾回收线程、屏幕更新线程等,都是Daemon线程。通常新创建的线程会从创建它的进程哪里继承daemon状态,除非明确地在线程对象上调用setDaemon方法来改变daemon状态。
需要注意的是,setDaemon()方法必须在调用线程的start()方法之前调用。一旦一个线程开始执行(如,调用了start()方法),它的daemon状态不能再修改。通过方法isDaemon()可以知道一个线程是否Daemon线程。
通过执行下面的代码,可以很清楚地说明daemon的作用。当设置线程t为Daemon线程时,只要User线程(main线程)一结束,程序立即退出,也就是说Daemon线程没有时间从10数到1。但是,如果将线程t设成非daemon,即User线程,则该线程可以完成自己的工作(从10数到1)。
import static java.util.concurrent.TimeUnit.*; 

public class DaemonTest {
	public static void main(String[] args) throws InterruptedException {   
        Runnable r = new Runnable() {   
            public void run() {   
                for (int time = 10; time > 0; --time) {   
                    System.out.println("Time #" + time);   
                    try {   
                        SECONDS.sleep(2);   
                    } catch (InterruptedException e) {   
                        e.printStackTrace();   
                    }   
                }   
            }   
        };   
           
        Thread t = new Thread(r);   
        t.setDaemon(true);  // try to set this to "false" and see what happens   
        t.start();   
           
        System.out.println("Main thread waiting...");   
        SECONDS.sleep(6);   
        System.out.println("Main thread exited.");   
    }   
}


t为Daemon线程的输出:
Time #10
Time #9
Time #8
Main thread exited.
Time #7
t为User线程的输出:
Main thread waiting...
Time #10
Time #9
Time #8
Main thread exited.
Time #7
Time #6
Time #5
Time #4
Time #3
Time #2
Time #1
分享到:
评论

相关推荐

    java中的daemon thread

    java中有两种类型的thread,user threads 和 daemon threads。 User threads是高优先级的thread,JVM将会等待所有的User Threads运行完毕之后才会结束运行。 daemon threads是低优先级的thread,它的作用是为User ...

    JAVA最新面试资料-备战2023金三银四

    java 中的线程分为两种:守护线程(Daemon)和用户线程(User)。任 何线程都可以设置为守护线程和用户线程,通过方法 Thread.setDaemon(boolon);true 则把该线程设置为守护线程,反之则为用户线程。 Thread....

    Java 守护线程,看这篇文章就对了! ( Daemon Thread )

    Java 的守护线程什么是Java的守护线程( Daemon Thread )?守护线程的区别?守护线程的作用?守护线程如何创建?守护线程如何判断?守护线程使用的注意事项总结 什么是Java的守护线程( Daemon Thread )? Java 提供...

    java 变形金刚中的守护神(守护线程)

    守护线程与用户线程(User Thread)的主要区别在于它们在程序生命周期中的角色。用户线程是应用程序运行的基础,只要还有用户线程在执行,Java虚拟机(JVM)就不会退出。而守护线程则不阻碍JVM的关闭,当所有用户...

    Java守护线程实例详解_动力节点Java学院整理

    Java中的线程可以分为两类:User Thread(用户线程)和Daemon Thread(守护线程)。在Java中,Daemon Thread是一种特殊的线程,它的主要作用是为其他线程的运行提供便利服务。守护线程的特点是只要当前JVM实例中尚...

    JAVA面试题 用于面试前练手,有需要的自取

    本文将详细讲解 Java 面试题,包括线程与进程的区别、多线程中的上下文切换、死锁与活锁的区别、Java 中守护线程和本地线程的区别、为什么使用 Executor 框架、Java 中 Executor 和 Executors 的区别、Java 中用到的...

    java线程和线程池的使用.docx

    在 Java 中,线程是程序执行的独立路径,它们允许应用程序并发执行多个任务。线程池则是一种管理线程的机制,它可以帮助我们更高效、更可控地使用线程资源。下面将详细介绍 Java 中线程的创建方式以及线程池的使用。...

    JUC代码演示 Java多线程并发

    在Java中,线程分为用户线程(User Thread)和守护线程(Daemon Thread)。这两种线程的区别主要在于程序退出的方式: - **用户线程**:默认创建的线程都是用户线程。如果程序中所有用户线程都结束了,则程序也会随...

    java虚拟机的详细原理

    引用类型用来表示Java中的对象。 ### 结论 Java虚拟机是Java语言的核心,它为Java程序提供了跨平台的执行环境。通过对JVM的深入理解,开发者可以更好地优化Java应用,提高程序的性能和稳定性。了解JVM的基本概念、...

    Java多线程守护线程

     在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)  作用  Daemon的作用是为其他线程的运行提供便利服务,守护线程典型的应用是 GC (垃圾回收器),它是一个很称职的守护者。  区别  ...

    2021版java高并发常问面试题

    在Java中,线程分为两种:守护线程(Daemon)和用户线程(User)。任何线程都可以设置为守护线程和用户线程,通过方法`Thread.setDaemon(boolon)`;`true`则把该线程设置为守护线程,反之则为用户线程。`Thread....

    Java线程之守护线程(Daemon)用法实例

    在Java中,线程分为两种类型:用户线程(User Thread)和守护线程(Daemon Thread)。这两种线程在大部分行为上是相同的,但它们在决定虚拟机何时退出时有显著差异。 用户线程是程序的主要部分,Java虚拟机(JVM)...

    sjava面试死锁

    在Java中,可以通过`java.util.concurrent`包中的`ExecutorService`和`ThreadPoolExecutor`来创建和管理线程池。 - **线程池的构成**: - **线程池管理器(ThreadPool)**:负责线程池的创建、销毁和任务调度。 -...

    浅谈java中守护线程与用户线程

    Java中的线程可以分为两类,即daemon线程(守护线程)和User线程(用户线程)。守护线程是一种特殊的线程,它们的生命周期并不受主线程的影响,而用户线程则是我们可以看到的线程。 在JVM启动时,main函数所在的...

    谈谈Java中的守护线程与普通线程

    Java中的线程分为两种类型:守护线程(Daemon)和用户线程(User)。这两类线程的主要区别在于它们对Java虚拟机(JVM)生命周期的影响。守护线程主要是为其他线程提供服务,比如垃圾回收线程,而用户线程则包含应用...

    并发编程 75 道面试题及答案.docx

    在 Java 中,线程可以分为两种:守护线程(Daemon)和用户线程(User)。任何线程都可以设置为守护线程或用户线程,通过方法 `Thread.setDaemon(bool on)`,true 则把该线程设置为守护线程,反之则为用户线程。守护...

    2万字Java并发编程面试题合集(含答案,建议收藏)

    6. **线程组**:线程组是线程的容器,但在Java中并不推荐使用,因为它们的功能有限,且可能导致复杂性增加。 7. **Executor框架**:Executor框架是Java Concurrency API的一部分,它提供了一种管理线程池的方式,...

Global site tag (gtag.js) - Google Analytics