`

Thread守护线程

 
阅读更多

在某段程序中看到了Thread.setDaemon的用法,经过学习以后了解:

1. setDaemon需要在start方法调用之前使用

2. 线程划分为用户线程和后台(daemon)进程,setDaemon将线程设置为后台进程

3. 如果jvm中都是后台进程,当前jvm将exit。(随之而来的,所有的一切烟消云散,包括后台线程啦)

4. 主线程结束后,

      1) 用户线程将会继续运行

      2) 如果没有用户线程,都是后台进程的话,那么jvm结束

另外:

setDaemon方法把java的线程设置为守护线程,此方法的调用必须在线程启动之前执行。只有在当前jvm中所有的线程都为守护线程时,jvm才会退出。
如果创建的线程没有显示调用此方法,这默认为用户线程。

实例如下:

package com.jack.mySample;  
 
import java.io.IOException;  
 
public class TestThread extends Thread {  
      
    public TestThread() {  
    }  
    /** *//** 
     * 线程的run方法,它将和其他线程同时运行 
     */ 
    public void run(){  
        for(int i = 1; i <= 100; i++){  
            try{  
                Thread.sleep(100);  
                  
            } catch (InterruptedException ex){  
                ex.printStackTrace();  
            }  
            System.out.println(i);  
        }  
    }  
    public static void main(String [] args){  
        TestThread test = new TestThread();  
        // 如果不设置daemon,那么线程将输出100后才结束  
        test.setDaemon(true);  
        test.start();  
        System.out.println("isDaemon = " + test.isDaemon());  
        try {  
            System.in.read(); // 接受输入,使程序在此停顿,一旦接收到用户输入,main线程结束,守护线程自动结束  
        } catch (IOException ex) {  
            ex.printStackTrace();  
        }  
    }  

 

补充说明:

定义:守护线程--也称“服务线程”,在没有用户线程可服务时会自动离开。

优先级:守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。

设置:通过setDaemon(true)来设置线程为“守护线程”;将一个用户线程设置为

      守护线程的方式是在 线程对象创建 之前 用线程对象的setDaemon方法。

example: 垃圾回收线程就是一个经典的守护线程,当我们的程序中不再有任何运行的

      Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是

      JVM上仅剩的线程时,垃圾回收线程会自动离开。它始终在低级别的状态中运行,用于

      实时监控和管理系统中的可回收资源。

生命周期:守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且

      周期性地执行某种任务或等待处理某些发生的事件。也就是

      说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。那Java的守护线程是

      什么样子的呢。当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个

      或以上的非守护线程则JVM不会退出。

 

分享到:
评论
2 楼 cczakai 2012-07-19  
除了我们说的主线程,其实还是很多子线程的。如果主线程没有退出,子线程挂掉了,那么通过守护线程可以检测,然后重启它。
1 楼 Wen_JN_86 2012-07-19  
我是初学者,不太明白守护进程有什么用,主线程可以不需要守护线程独立的运行,而且主线程退出的话守护线程也会退出,那么守护线程的作用是什么呢?

相关推荐

    linux c++ 守护线程,判断程序是否运行,不存在就启动

    在Linux系统中,C++编程时常常需要创建守护线程(daemon thread)来执行特定的任务,比如监控系统状态、定时任务或确保某个服务始终运行。守护线程是一种长期运行的后台进程,它不依赖于终端会话,即使用户注销或者...

    ASPNET中实现在线用户检测(使用后台守护线程).rar

    守护线程是一种特殊的线程,它在应用程序启动时创建,并在所有其他非守护线程结束后继续运行,直到应用程序关闭。在ASP.NET环境中,我们可以巧妙地运用守护线程来定期更新在线用户列表。 首先,我们需要创建一个...

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

    在Java编程语言中,守护线程(Daemon Thread)被称为“变形金刚中的守护神”,这是因为它们在后台默默地工作,为应用程序提供必要的服务,而不会阻止程序的退出。理解并正确使用守护线程是Java多线程编程中的一个...

    线程守护程序

    在Java中,一个线程被标记为守护线程(Daemon Thread)后,它不会阻止Java虚拟机(JVM)的退出。正常情况下,JVM会在所有非守护线程结束后退出。但如果存在守护线程,即使没有其他非守护线程,JVM也会继续运行,直到...

    浅谈java的守护线程与非守护线程

    在Java中,有两类线程:UserThread(用户线程)和Daemon Thread(守护线程)。守护线程的作用是为其他线程的运行提供服务,比如说GC线程。它们的本质上来说没有区别,唯一的区别之处就在虚拟机的离开:如果User ...

    守护线程系统-含源码

    在Java编程中,守护线程(Daemon Thread)是一种特殊的线程类型,它的主要作用是为应用程序提供后台服务,而不会阻止程序的退出。当所有的非守护线程(用户线程)结束时,JVM会自动关闭守护线程并退出。在本项目...

    守护线程--源码--练手

    守护线程,也被称为后台线程,是Java编程语言中的一种特殊线程类型。它们的主要特点是在所有非守护线程(用户线程)结束后,守护线程才会被系统强制结束。在Windows环境下,通常我们使用服务来实现长期运行的任务,...

    ASPNET中实现在线用户检测(使用后台守护线程)

    根据提供的信息,我们可以详细探讨如何在ASP.NET中实现在线用户检测功能,并且通过使用后台守护线程来确保这一过程能够持续有效地运行。 ### ASP.NET中实现在线用户检测 #### 背景介绍 在线用户检测是一项重要的...

    【java 多线程】守护线程与非守护线程的详解

    Java 中有两类线程:User Thread(用户线程)和 Daemon Thread(守护线程)。用户线程即运行在前台的线程,而守护线程是运行在后台的线程。守护线程的作用是为其他前台线程的运行提供便利服务,而且仅在普通、非守护...

    什么是java的守护线程.pdf

    Java中的守护线程(Daemon Thread)是Java虚拟机(JVM)的一种特殊线程类型,它们在后台执行任务,主要用于为应用程序的其他非守护线程提供服务。守护线程的一个典型例子是垃圾回收器(Garbage Collector),它默默...

    详解Java线程-守护线程与用户线程

    Java中的线程可以分为守护线程(DaemonThread)和用户线程(UserThread)两类。守护线程和用户线程的唯一区别是它们对虚拟机的退出(程序的终止)的影响。 当JVM中只有守护线程时,虚拟机会退出,程序终止;而当JVM中至少...

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

    这个例子里main函数是唯一的用户线程,thread线程是守护线程,当main线程运行结束后,JVM发现当前已经没有用户线程了,就会终止JVM进程。 在JVM中,在main线程运行结束后,JVM会自动启动一个叫做DestroyJavaVM的...

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

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

    守护线程确保pushService

    在Android中,我们可以通过设置Thread的daemon属性将其转换为守护线程。 2. **保活策略**: - **双进程保活**:创建一个辅助进程,将关键服务运行在这个进程中。这样即使主进程被系统回收,辅助进程仍然可以存活,...

    python实现守护进程、守护线程、守护非守护并行

    Python中的守护进程(daemon process)、守护线程(daemon thread)以及如何实现守护和非守护的并行处理是多任务编程中的重要概念。在Python中,这些功能主要通过`multiprocessing`和`threading`模块来实现。 守护...

    java多线程thread实例

    - 守护线程是一种特殊的线程,当所有非守护线程结束时,守护线程也会自动终止。`setDaemon(true)`方法可以将线程设置为守护线程。 8. **线程池** - Java提供`ExecutorService`和`ThreadPoolExecutor`来管理线程池...

    JVM中的守护线程示例详解

    在Java虚拟机(JVM)中,线程分为两类:用户线程(User Thread)和守护线程(Daemon Thread)。这两类线程的主要区别在于它们的生命周期与JVM的关系。 1. **用户线程**:用户线程是应用程序中常见的线程类型,它们...

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

    在这个例子中,`daemonThread`是守护线程,`main`线程是非守护线程。如果`main`线程结束而`daemonThread`仍在运行,JVM仍会继续运行直到`daemonThread`完成。反之,如果`daemonThread`还在运行,但所有非守护线程...

    Java多线程的线程守护两个例子_.docx

    守护线程与普通线程的主要区别在于,当JVM中没有非守护线程(用户线程)在运行时,JVM会自动退出,即使仍有守护线程在工作。这使得守护线程常用于提供系统级的服务,例如垃圾回收(Garbage Collection)、内存管理等...

    Java多线程守护线程

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

Global site tag (gtag.js) - Google Analytics