首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Java中的守护进程线程是什么?

Java中的守护进程线程是什么?

提问于 2017-12-15 06:08:09
回答 2关注 0查看 1.2K

有谁可以告诉我什么是Java的守护线程?

回答 2

人生的旅途

发布于 2017-12-15 07:00:25

守护线程与普通线程的唯一区别是:

理解一 : 守护线程就是main同生共死,当main退出,它将终止,而普通线程是在任务执行结束才停止。

理解二: 用户线程:Java虚拟机在它所有非守护线程已经离开后自动离开。守护线程则是用来服务用户线程的,如果没有其他用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。

例如:我们所熟悉的Java垃圾回收线程就是一个典型的守护线程,当我们的程序中不再有任何运行中的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。

测试代码:

线程

代码语言:txt
AI代码解释
复制
[java] view plain copy
代码语言:txt
AI代码解释
复制
public class ThreadDemo implements Runnable {  
代码语言:txt
AI代码解释
复制
     public void run() {  
代码语言:txt
AI代码解释
复制
      while (true) {  
代码语言:txt
AI代码解释
复制
            for (int i = 1; i <= 100; i++) {  
代码语言:txt
AI代码解释
复制
                System.out.println(i);  
代码语言:txt
AI代码解释
复制
                try {  
代码语言:txt
AI代码解释
复制
                    Thread.sleep(1000);  
代码语言:txt
AI代码解释
复制
                } catch (InterruptedException e) {  
代码语言:txt
AI代码解释
复制
                    e.printStackTrace();  
代码语言:txt
AI代码解释
复制
                }  
代码语言:txt
AI代码解释
复制
              }  
代码语言:txt
AI代码解释
复制
       }      
代码语言:txt
AI代码解释
复制
    }  
代码语言:txt
AI代码解释
复制
}  
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
[java] view plain copy
代码语言:txt
AI代码解释
复制
public class Test {  
代码语言:txt
AI代码解释
复制
    public static void main(String[] args) {  
代码语言:txt
AI代码解释
复制
        Thread daemonThread = new Thread(new ThreadDemo());  
代码语言:txt
AI代码解释
复制
        daemonThread.setName("测试thread");  
代码语言:txt
AI代码解释
复制
        // 设置为守护进程  
代码语言:txt
AI代码解释
复制
                daemonThread.setDaemon(true);  
代码语言:txt
AI代码解释
复制
                daemonThread.start();  
代码语言:txt
AI代码解释
复制
                System.out.println("isDaemon = " + daemonThread.isDaemon());  
代码语言:txt
AI代码解释
复制
                Thread t = new Thread(new ThreadDemo());  
代码语言:txt
AI代码解释
复制
                t.start();  
代码语言:txt
AI代码解释
复制
    }  
代码语言:txt
AI代码解释
复制
}  

因为有线程t 的存在,守护线程daemonThread 一直执行,当将下面代码注释掉时,守护线程daemonThread ,随着main结束,而结束。

代码语言:txt
复制
代码语言:txt
AI代码解释
复制
[java] view plain copy
代码语言:txt
AI代码解释
复制
Thread t = new Thread(new ThreadDemo());  
代码语言:txt
AI代码解释
复制
t.start();  

个人理解:当仅剩下的线程都是守护线程时,java虚拟机会离开.也就是停止.

御姐万岁

发布于 2017-12-15 06:59:22

守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统关闭时终止。Linux系统有很多守护进程,大多数服务都是通过守护进程实现的,同时,守护进程还能完成许多系统任务,例如,作业规划进程crond、打印进程lqd等(这里的结尾字母d就是Daemon的意思)。

守护线程在没有用户线程可服务时自动离开,在Java中比较特殊的线程是被称为守护(Daemon)线程的低级别线程。 这个线程具有最低的优先级,用于为系统中的其它对象和线程提供服务。将一个用户线程设置为守护线程的方式是在线程对象创建之前调用线程对象的setDaemon方法。

典型的守护线程例子是JVM中的系统资源自动回收线程,我们所熟悉的Java垃圾回收线程就是一个典型的守护线程, 当我们的程序中不再有任何运行中的Thread,程序就不会再产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收线程是Java虚拟机上仅剩的线程时,Java虚拟机会自动离开。 它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。

守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。

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

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

如果还有一个或以上的非守护线程则JVM不会退出。

代码语言:txt
AI代码解释
复制
public class DameonThread extends Thread {    
代码语言:txt
AI代码解释
复制
         
代码语言:txt
AI代码解释
复制
    public DameonThread() {    
代码语言:txt
AI代码解释
复制
    }    
代码语言:txt
AI代码解释
复制
    /** *//**  
代码语言:txt
AI代码解释
复制
     * 线程的run方法,它将和其他线程同时运行  
代码语言:txt
AI代码解释
复制
     */   
代码语言:txt
AI代码解释
复制
    public void run(){    
代码语言:txt
AI代码解释
复制
        for(int i = 1; i <= 100; i++){    
代码语言:txt
AI代码解释
复制
            try{    
代码语言:txt
AI代码解释
复制
                Thread.sleep(100);    
代码语言:txt
AI代码解释
复制
                     
代码语言:txt
AI代码解释
复制
            } catch (InterruptedException ex){    
代码语言:txt
AI代码解释
复制
                ex.printStackTrace();    
代码语言:txt
AI代码解释
复制
            }    
代码语言:txt
AI代码解释
复制
            System.out.println(i);    
代码语言:txt
AI代码解释
复制
        }    
代码语言:txt
AI代码解释
复制
    }    
代码语言:txt
AI代码解释
复制
    public static void main(String [] args){    
代码语言:txt
AI代码解释
复制
        DameonThread test = new DameonThread();    
代码语言:txt
AI代码解释
复制
        test.setDaemon(true);    
代码语言:txt
AI代码解释
复制
        test.start();    
代码语言:txt
AI代码解释
复制
        System.out.println("isDaemon = " + test.isDaemon());    
代码语言:txt
AI代码解释
复制
        try {    
代码语言:txt
AI代码解释
复制
            System.in.read(); // 接受输入,使程序在此停顿,一旦接收到用户输入,main线程结束,守护线程自动结束     
代码语言:txt
AI代码解释
复制
        } catch (IOException ex) {    
代码语言:txt
AI代码解释
复制
            ex.printStackTrace();    
代码语言:txt
AI代码解释
复制
        }    
代码语言:txt
AI代码解释
复制
    }    
代码语言:txt
AI代码解释
复制
   
代码语言:txt
AI代码解释
复制
}  
和开发者交流更多问题细节吧,去 写回答
相关文章
守护线程与守护进程
一 守护进程 主进程创建守护进程   其一:守护进程会在主进程代码执行结束后就终止   其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children 注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止 from multiprocessing import Process import time import random class Piao(Process):
用户1214487
2018/01/23
1.9K0
守护线程和非守护线程_java守护线程的作用
Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)
全栈程序员站长
2022/11/04
5680
守护线程和非守护线程_java守护线程的作用
守护线程和非守护线程的区别以及用法_python多线程守护进程
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/03
5950
父子进程 父子线程 守护线程
参考 Java中的父线程与子线程 守护线程与守护进程 主线程与子线程生命周期没关系 Son.java public class Son extends Thread { private Thread parent; public Son(Thread parent) { this.parent = parent; } @Override public void run() { while (true) {
平凡的学生族
2019/05/25
9430
java中守护线程与用户线程
Java线程分为两类分别为daemon线程(守护线程)和User线程(用户线程),在JVM启动时候会调用main函数,main函数所在的线程是一个用户线程,这个是我们可以看到的线程,其实JVM内部同时还启动了好多守护线程,比如垃圾回收线程。那么守护线程和用户线程有什么区别那?区别之一是当最后一个非守护线程结束时候,JVM会正常退出,而不管当前是否有守护线程,也就是说守护线程是否结束并不影响JVM的退出。言外之意是只要有一个用户线程还没结束正常情况下JVM就不会退出。
加多
2018/09/06
1.3K0
java中守护线程与用户线程
【小家java】Java里的进程、线程、协程 、Thread、守护线程、join线程的总结
说到线程,很多人最直观的感受就是多线程。本章不讨论高并发、多线程之类的。返璞归真,咱们来讨论讨论线程这个东西到底是什么东西,着眼于线程本身,我们怎么玩? 为了了解线程,这里我不得不搬出来线程的概念了:
YourBatman
2019/09/03
8360
【小家java】Java里的进程、线程、协程 、Thread、守护线程、join线程的总结
守护线程是什么_守护线程什么时候结束
守护线程是程序运行的时候在后台提供一种通用服务的线程。所有用户线程停止,进程会停掉所有守护线程,退出程序。
全栈程序员站长
2022/11/03
7000
Java多线程-守护线程
把一个正在向文件中执行写入操作的线程设置为守护线程,在写入过程中结束用户主线程,那么该守护线程也会随之结束。
itze
2022/10/31
7010
Java多线程-守护线程
JVM 中的守护线程
在之前的《详解JVM如何处理异常》提到了守护线程,当时没有详细解释,所以打算放到今天来解释说明一下JVM守护线程的内容。
技术小黑屋
2018/12/27
6000
创建Java守护线程
Java运行时利用特殊类型的线程来执行后台任务,这称为守护程序线程。这些支持线程管理诸如垃圾收集之类的后后任务。守护程序线程是特殊的,因为如果JVM中运行的唯一线程是守护程序线程,则Java运行时将关闭或退出。
FunTester
2020/05/26
1.8K0
thread 守护线程_守护线程与非守护线程
  Java中线程分为用户线程(user thread)和守护线程(daemon thread),它们通过Thread的daemon属性标识:true表示守护线程,false表示用户线程。   一个Thread初始默认为用户线程(daemon默认为false),创建Thread的时候默认从当前线程”继承”daemon属性,见Thread.init方法:
全栈程序员站长
2022/11/04
5070
Java并发-守护线程-Daemon
 我们如上在main线程中定义了一个子线程t,将子线程的run方法写为sleep调用比main方法的sleep调用更久时间,以验证父类线程main的执行完毕并释放对子线程有无影响。 控制台输出:
Fisherman渔夫
2020/02/18
5040
Java守护线程「建议收藏」
守护线程,是指在程序运行的时,后台提供一种通用服务的线程。比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。
全栈程序员站长
2022/11/03
1.5K0
Java 多线程系列(3) —— 守护线程
在 Java 中,守护线程的设置非常简单,我们只需要调用 Thread 类的 setDaemo(true) 就行。同时我们也可以使用 isDaemon() 方法来查看一个线程是否是守护线程。 【示例】
求和小熊猫
2020/12/02
4290
守护进程
守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。
zy010101
2020/09/02
1.9K0
守护进程
a.创建子进程,父进程退出,一切工作在子进程中执行,形式上脱离了控制终端 b.在子进程中创建新的会话(会话后面章节会提到),使子进程完全独立出来,脱离控制 c.改变当前目录为根目录,防止占用其他可卸载的文件系统 d.重设文件权限掩码,防止继承的文件创建屏蔽字拒绝某些权限,增加守护进程的灵活性 e.关闭文件描述符 f.守护进程退出处理
看、未来
2020/08/26
1.9K0
守护进程
守护进程
我们知道linux有许多自带的守护进程,比如syslogd、crond、sendmail等。那用户或开发者自己编写的程序为什么也需要成为守护进程呢?
Stare
2019/03/04
2.8K0
守护进程
Java 中守护线程和本地线程有什么区别?
Java 中的守护线程(Daemon Thread)和本地线程(User Thread)是两种不同类型的线程,它们有以下几个方面的区别:
用户1289394
2023/08/22
4240
Java 中守护线程和本地线程有什么区别?
Java中的多线程和多进程
注意:大多线程是模拟出来的(感官上的多线程同步),真正的多线程指的是有多个CPU/核。
matt
2022/10/25
1.2K0
Java中的多线程和多进程
点击加载更多

相似问题

java进程监控?

1507

kdevtmpfsi 这个进程是什么?

610K

在Jenkins上构建Android项目时,Gradle构建守护进程意外消失了?

32.7K

Java中默认范围是什么?

2223

多线程并行和多线程并发的区别是什么?

2312
相关问答用户
腾讯云TDP | TDP会员擅长3个领域
平安资管 | 架构师擅长4个领域
擅长3个领域
擅长5个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档