JAVA守护线程 非守护线程

Java的守护线程和非守护线程 原文地址:http://www.cnblogs.com/super-d2/p/3348183.html 最近重新研究Java基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) ,(PS:以前忽略了)。 用户线程:非守护线程包括常规的用户线程或诸如用于处理GUI事件 阅读详情


Java守护线程:可以理解为后台管理者,服务线程!!!

应用道友的例子:

1.比如你正在 用 Java 写成的编辑器 写 Word 文档,你一边敲键盘,这是个 非守护线程, 后台还有一个 拼写检查 线程,它是个守护线程,他尽量不打扰你写稿子, 你们可以同时进行,他发现有拼写错误时在状态条显示错误,但是你可以忽略。

2.就像 城堡门前有个卫兵 (守护线程),里面有诸侯(非守护线程),他们是可以同时干着各自的活儿,但是 城堡里面的人都搬走了, 那么卫兵也就没有存在的意义了。

from:http://www.cnblogs.com/super-d2/p/3348183.html

    估计学过Unix开发但是没有细致学习Java的同学们会疑惑了,操作系统里面是没有所谓的守护线程的概念,只有守护进程一说,但是Java语言机制是构建在JVM的基础之上的,意思是Java平台把操作系统的底层给屏蔽起来,所以它可以在它自己的虚拟的平台里面构造出对自己有利的机制,而语言或者说平台的设计者多多少少是收到Unix思想的影响,而守护线程机制又是对JVM这样的平台凑合,于是守护线程应运而生。

     Daemon的作用是为其他线程的运行提供服务,比如说GC线程。其实User Thread线程和Daemon Thread守护线程本质上来说去没啥区别的,唯一的区别之处就在虚拟机的离开:如果User Thread全部撤离,那么Daemon Thread也就没啥线程好服务的了,所以虚拟机也就退出了。

       守护线程并非虚拟机内部可以提供,用户也可以自行的设定守护线程,方法:public final void setDaemon(boolean on) ;但是有几点需要注意:

1)、thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。  (备注:这点与守护进程有着明显的区别,守护进程是创建后,让进程摆脱原会话的控制+让进程摆脱原进程组的控制+让进程摆脱原控制终端的控制;所以说寄托于虚拟机的语言机制跟系统级语言有着本质上面的区别)

2)、 在Daemon线程中产生的新线程也是Daemon的。  (这一点又是有着本质的区别了:守护进程fork()出来的子进程不再是守护进程,尽管它把父进程的进程相关信息复制过去了,但是子进程的进程的父进程不是init进程,所谓的守护进程本质上说就是“父进程挂掉,init收养,然后文件0,1,2都是/dev/null,当前目录到/”)

3)、不是所有的应用都可以分配给Daemon线程来进行服务,比如读写操作或者计算逻辑。因为在Daemon Thread还没来的及进行操作时,虚拟机可能已经退出了。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1.  class ThreadDemo implements Runnable {  
  2.      public void run() {  
  3.       while (true) {  
  4.             for (int i = 1; i <= 10; i++) {  
  5.                 System.out.println(i);  
  6.                 try {  
  7.                     Thread.sleep(1000);  
  8.                 } catch (InterruptedException e) {  
  9.                     e.printStackTrace();  
  10.                 }  
  11.               }  
  12.        }      
  13.     }  
  14. }  
  15. public class Demo {  
  16.     public static void main(String[] args) {  
  17.         Thread daemonThread = new Thread(new ThreadDemo());  
  18.         daemonThread.setName("测试thread");  
  19.         // 设置为守护进程  
  20.                 daemonThread.setDaemon(true);  
  21.                 daemonThread.start();  
  22.                 System.out.println("isDaemon = " + daemonThread.isDaemon());  
  23.                 /*Thread t = new Thread(new ThreadDemo()); 
  24.                 t.start();*/  
  25.     }  
  26. }  
  27. /*因为有线程t 的存在,守护线程daemonThread 一直执行,当将下面代码注释掉时,守护线程daemonThread ,随着main结束,而结束。 
  28.  
  29. Thread t = new Thread(new ThreadDemo()); 
  30. t.start();*/  

守护线程与非守护线程

最近在看多线程的Timer章节,发现运用到了守护线程,感觉Java的基础知识还是需要补充。

Java分为两种线程:用户线程和守护线程

所谓守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因 此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。

守护线程和用户线程的没啥本质的区别:唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。

将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现。在使用守护线程时需要注意一下几点:

(1) thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。

(2) 在Daemon线程中产生的新线程也是Daemon的。

(3) 守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。

Timer代码示例:

import java.util.Date;
import java.util.TimerTask;
public class MyTask extends TimerTask
{
  @Override
  public void run() {
    System.out.println("任务执行了,时间为:"+new Date());
}

主函数

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

public class Test1 {
public static void main(String[] args){
    System.out.println("当前时间:"+new Date());
    Calendar calendar=Calendar.getInstance();
    calendar.add(Calendar.SECOND,10);
    Date date=calendar.getTime();
    MyTask task=new MyTask();
    Timer timer=new Timer();
    timer.schedule(task,date);
   }
}

运行结果:

    当前时间:Sat Jun 03 11:47:40 CST 2017
    任务执行了,时间为:Sat Jun 03 11:47:50 CST 2017

任务虽然运行完了,但进程还未销毁,呈红色状态,为什么会出现这种情况呢?

可以看一下Timer的源码

public Timer() {
    this("Timer-" + serialNumber());
}
public Timer(String name) {
    thread.setName(name);
    thread.start();
}

可以看出每创建一个Timer就是启动一个新的线程,那么启动的线程不是守护线程,所以一直运行。将新创建的的Timer改成守护线程,更改如上的代码:

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class Test1 {
public static void main(String[] args){
    System.out.println("当前时间:"+new Date());
    Calendar calendar=Calendar.getInstance();
    calendar.add(Calendar.SECOND,10);
    Date date=calendar.getTime();
    MyTask task=new MyTask();
    Timer timer=new Timer(true);
    timer.schedule(task,date);
 }
}

运行结果如下:

当前时间:Sat Jun 03 11:47:40 CST 2017

守护线程中产生的线程也是守护线程

如下示例:

public class Daemon implements Runnable {
private Thread[] t = new Thread[10];

@Override
public void run() {
    for (int i=0; i<t.length; i++) {

        t[i] = new Thread(new DaemonSpawn());

        t[i].start();

        System.out.println("DaemonSpawn " + i + " started.");

    }

    for (int i=0; i<t.length; i++) {

        System.out.println("t[" + i + "].isDaemon() = " +

                t[i].isDaemon() + ".");

    }

    while (true) {

        Thread.yield();

    }


}
}

类DaemonSpawn:

public class DaemonSpawn implements Runnable {
@Override
public void run() {
    while (true) {

        Thread.yield();

    }


}
}

主函数:

import java.util.concurrent.TimeUnit;
public class Test1 {
public static void main(String[] args) throws InterruptedException {
    Thread d = new Thread(new Daemon());

    d.setDaemon(true); //必须在启动线程前调用

    d.start();

    System.out.println("d.isDaemon() = " + d.isDaemon() + ".");

    TimeUnit.SECONDS.sleep(1);
}
}

运行结果如图:

d.isDaemon() = true.
DaemonSpawn 0 started.
DaemonSpawn 1 started.
DaemonSpawn 2 started.
DaemonSpawn 3 started.
DaemonSpawn 4 started.
DaemonSpawn 5 started.
DaemonSpawn 6 started.
DaemonSpawn 7 started.
DaemonSpawn 8 started.
DaemonSpawn 9 started.
t[0].isDaemon() = true.
t[1].isDaemon() = true.
t[2].isDaemon() = true.
t[3].isDaemon() = true.
t[4].isDaemon() = true.
t[5].isDaemon() = true.
t[6].isDaemon() = true.
t[7].isDaemon() = true.
t[8].isDaemon() = true.
t[9].isDaemon() = true.

Process finished with exit code 0

如果将mian函数中的TimeUnit.SECONDS.sleep(1);注释掉,看一下TimeUnit.SECONDS.sleep()的源码:

public void sleep(long timeout) throws InterruptedException {
    if (timeout > 0) {
        long ms = toMillis(timeout);
        int ns = excessNanos(timeout, ms);
        Thread.sleep(ms, ns);
    }
}

其实就是对Thread.sleep()的封装,提供了可读性更好的线程暂停操作
注释后代码运行如下:

d.isDaemon() = true.
DaemonSpawn 0 started.
DaemonSpawn 1 started.
DaemonSpawn 2 started.
DaemonSpawn 3 started.
DaemonSpawn 4 started.
DaemonSpawn 5 started.
DaemonSpawn 6 started.
DaemonSpawn 7 started.
DaemonSpawn 8 started.
DaemonSpawn 9 started.

以上结果也说明了如果用户线程全部退出了,只剩下守护线程存在了,虚拟机也就退出了。

vmware vsphere5---部署vCSA(VMware vCenter Server)附带第二阶段安装报错解决方案 因为这份文档我是边做边写的,遇到问题重新装了好几次所以IP会很乱ESXI主机为192.168.20.10VCSA为192.168.20.7,后台为192.168.20.7:5480后期请自行对应,后面的192.168.20.57请对应192.168.20.7,或根据自己的来。 阅读详情

相关推荐

基于RTL8367S与XS2184的工业级POE交换机硬件设计全解析

本文深入解析基于RTL8367S与XS2184芯片的工业级POE交换机硬件设计,涵盖核心价值、芯片选型、原理图设计、PCB布局及可靠性验证等关键环节。重点探讨双芯片协同工作优势,如RTL8367S的自适应调度算法和XS2184的智能功率分配功能,为工业环境下的稳定供电与数据传输提供专业解决方案。

weixin_42614269的博客 458

Java中的守护线程和非守护线程

Java中有两类线程: User Thread(用户线程) Daemon Thread(守护线程) 守护线程也叫后台线程, 指的是程序在运行的时候后台提供一种通用服务的线程, 比如jvm中垃圾回收线程, 这种线程并不属于程序中不可或缺的部分. 因此当所有非守护线程结束时, 程序也就终止了, 同时会杀死进程中所有的守护线程. 反过来说, 只要有任何非守护线程在运行, 程序就不会终止. 守护线程...

weixin_43235210的博客 1167

Python制作【大麦网】自动抢票程序

Python 的迅速崛起对整个行业来说都是极其有利的,但“人红是非多”,导致它平添了许许多多的批评,不过依旧挡不住它火爆的发展势头。如果你对Python感兴趣,想要学习pyhton,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓点击这里。

mate1357的博客 2万+

java守护线程和非守护线程

守护进程: 在Java中有两类线程: User Thread(用户线程):不随主线程的结束而结束,直到自己运行完 Daemon Thread(守护线程) :当前JVM存在任何非守护线程时,守护线程就还可以工作(除非自己结束) 举例理解: public class TestDaemon { public static void main(String[] args) { //守护线程 睡眠5s Thread daemonThread = new Thread(()->{ try .

huangyung的专栏 689

MTK Tunning ISP 模块面试总结

ISP面试问答

m0_72053187的博客 4537

国腾|GM8775C替换TC358775/MIPI转双通道LVDS

1 产品概述 GM8775C 型DSI 转双通道 LVDS 发送器产品主要实现将MIPI DSI 转单/双通道 LVDS 功能,MIPI 支持 1/2/3/4 通道可选,最大支持 4Gbps 速率。LVDS时钟频率最高154MHz,最大支持视频格式为 FULL HD(1920 x 1200)。 该芯片主要应用于手持设备、双屏显示,大屏幕显示等应用需求。 2 产品特征 a) I/0电源电压:1.8V /3.3V; b) core 电源电压...

Vasse的博客 1072

python守护线程和非守护线程_Java的守护线程与非守护线程

守护线程与非守护线程最近在看多线程的Timer章节,发现运用到了守护线程,感觉Java的基础知识还是需要补充。Java分为两种线程:用户线程和守护线程所谓守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因 此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护...

weixin_39980809的博客 143

PPPoE上网配置不求人:华为路由器命令行操作指南(2023最新版)

本文提供2023年最新的华为路由器PPPoE上网配置命令行操作指南。通过详细的步骤讲解,从连接设备、创建拨号接口、绑定PPPoE客户端到配置内网与NAT,手把手教你完成配置,并附有验证排错方法,助你轻松实现稳定上网。

s4t5u6v的博客 679

java多线程_守护线程和非守护线程

基本概念 守护线程:和主线程一起结束的线程,叫守护线程。 非守护线程:主线程的结束不影响线程的执行的线程,也叫用户线程。 如何将一个线程t变成守护线程 调用t.setDaemon(true)方法将非守护线程变为守护线程。; 示例代码 非守护线程: Thread t = new Thread(new Runnable() { public void r...

叶清逸的博客 1972

麒麟v10(ky10.x86_64)升级——openssl-3.2.2、openssh-9.8p1

执行命令: make -j 4 && make install 这里要等待一段时间,等待编译完成。执行命令: ./configure --prefix=/usr/local/src/zlilb。执行命令: ./config --prefix=/usr/local/src/openssl。执行命令: make -j 4 && make test && make install。执行命令: make -j 4 && make install。执行命令: /etc/init.d/sshd restart。

X_yufei的博客 7428

Altium Designer 超详细入门教程

本文是一份Altium Designer新手入门教程,详细介绍了从软件基础到PCB制版的全流程。主要内容包括:软件界面介绍与工程创建方法;原理图设计中的元件放置、电气连线、标注添加等操作;PCB设计的布局布线、铺铜和DRC检查;Gerber和钻孔文件的导出方法。教程还提供了分类整理的实用快捷键表和新手避坑指南,强调原理图编译和DRC检查的重要性。通过本教程,新手可以快速掌握AD基本操作,完成简单电路板的设计与制版文件导出。

学习中...... 817

java 守护线程 例子_Java中的守护线程 & 非守护线程(简介)

守护线程(DaemonThread)非守护线程,又称用户线程(UserThread)用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。守护线程最典型的应用就是GC(垃圾回收器)守护线程通常是由虚拟机自行创建使用,不过通过编码同样...

weixin_34987818的博客 264

SAP会计凭证导入ABAP开发模板+注意点—附带源码

开发并不仅仅只要考虑实现的功能,只实现功能的是程序,考虑到使用场景的是工程。使用bapi校验创建会计凭证的数据,报错和参数和正式创建一致。用途,防止产生错误的凭证,即使财务凭证可以冲销。正式创建会计凭证。隐藏的坑。

小九啥也不会 1232

JAVA守护线程非守护线程,java多线程_守护线程和非守护线程

基本概念守护线程:和主线程一起结束的线程,叫守护线程。非守护线程:主线程的结束不影响线程的执行的线程,也叫用户线程。如何将一个线程t变成守护线程调用t.setDaemon(true)方法将非守护线程变为守护线程。;示例代码非守护线程:Thread t = new Thread(new Runnable() {public void run() {// TODO Auto-generated met...

weixin_29696999的博客 190

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java中的守护线程和非守护线程(转载)

<什么是守护线程,什么是非守护线程> Java有两种Thread:“守护线程Daemon”(守护线程)与“用户线程User”(非守护线程)。 用户线程:非守护线程包括常规的用户线程或诸如用于处理GUI事件的事件调度线程,Java虚拟机在它所有非守护线程已经离开后自动离开。 守护线程:守护线程则是用来服务用户线程的,比如说GC线程。如果没有其他用户线程在运行,那么就没有可服务对象,...

weixin_30387663的博客 106

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

在java web项目中慎用Executors以及非守护线程

最近研究embeded tomcat,特别是关于tomcat启动和关闭的模块。通过查看相应的源代码, 我们知道tomcat的关闭是通过往相应的关闭端口发送指定的关闭指令来达到关闭tomcat的目的。但是有的时候,通过shutdown.bat或 shutdown.sh却不能有效地关闭tomcat,网上也有很多人提出这个问题。通过相关资料,最后问题出现线程上。 首先看java虚拟机退出的条件

疯狂程序员 6912

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java中的守护线程 & 非守护线程(简介)

守护线程 (Daemon Thread) 非守护线程,又称用户线程(User Thread) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。 守护线程最典型的应用就是 GC (垃圾回收器) 守护线程通常是由虚拟机自行创建使用,

xiaotom5的专栏 1483

PyQt5界面现代化改造:qfluentwidgets无边框窗口实战

桌面应用界面开发中,窗口样式直接影响用户体验。传统Qt框架依赖系统标题栏,样式受限于操作系统,难以实现现代化视觉效果。无边框窗口技术通过移除系统边框,配合自绘标题栏和QSS样式,提供高度可定制的界面方案。qfluentwidgets作为基于QSS的组件库,与PyQt5深度兼容,提供FramelessMainWindow等封装,自动处理窗口拖动、缩放和阴影效果,让开发者无需从零实现底层逻辑。该方案特别适合工具类软件和已有PyQt5项目,能在不迁移QML或PySide6的情况下显著提升界面质感。本文基于实际工程

weixin_34192816的博客 373

java面试题之你了解守护线程吗?它和非守护线程有什么区别

程序运行完毕,jvm会等待非守护线程完成后关闭,但是jvm不会等待守护线程。 守护线程最典型的的例子是:GC线程 转载于:https://www.cnblogs.com/hujinshui/p/10212136.html...

weixin_38168786的博客 399

【转】在java web项目中慎用Executors以及非守护线程

最近研究embeded tomcat,特别是关于tomcat启动和关闭的模块。通过查看相应的源代码, 我们知道tomcat的关闭是通过往相应的关闭端口发送指定的关闭指令来达到关闭tomcat的目的。但是有的时候,通过shutdown.bat或shutdown.sh却不能有效地关闭tomcat,网上也有很多人提出这个问题。通过相关资料,最后问题出现线程上。      首先看java虚拟机退出的

咖啡加醋 686

java web结束线程_在java web项目中慎用Executors以及非守护线程

最近研究embeded tomcat,特别是关于tomcat启动和关闭的模块。通过查看相应的源代码, 我们知道tomcat的关闭是通过往相应的关闭端口发送指定的关闭指令来达到关闭tomcat的目的。但是有的时候,通过shutdown.bat或shutdown.sh却不能有效地关闭tomcat,网上也有很多人提出这个问题。通过相关资料,最后问题出现线程上。首先看java虚拟机退出的条件,如下所示:如...

weixin_36166558的博客 234
上一篇: WEB环境搭建(tomcat)、Eclipse连接tomcat
下一篇: 一个.java文件中是否可以有多个类
scnuwilliams
博客等级 码龄10年 32粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值