Java中的守护线程和非守护线程(转载)
<什么是守护线程,什么是非守护线程>
Java有两种Thread:“守护线程Daemon”(守护线程)与“用户线程User”(非守护线程)。
用户线程:非守护线程包括常规的用户线程或诸如用于处理GUI事件的事件调度线程,Java虚拟机在它所有非守护线程已经离开后自动离开。
守护线程:守护线程则是用来服务用户线程的,比如说GC线程。如果没有其他用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。(操作系统里面是没有所谓的守护线程的概念,只有守护进程一说,但是Java语言机制是构建在JVM的基础之上的,意思是Java平台把操作系统的底层给屏蔽起来,所以它可以在它自己的虚拟的平台里面构造出对 自己有利的机制,而语言或者说平台的设计者多多少少是受到Unix思想的影响,而守护线程机制又是对JVM这样的平台凑合,于是守护线程应运而生);
守护线程使用的情况较少,但并非无用,举例来说,JVM的垃圾回收、内存管理等线程都是守护线程。还有就是在做数据库应用时候,使用的数据库连接池,连接池本身也包含着很多后台线程,监控连接个数、超时时间、状态等等。
守护线程与用户线程的唯一区别是:其实User Thread线程和Daemon Thread守护线程本质上来说去没啥区别的,唯一的区别之处就在虚拟机的离开,当JVM中所有的线程都是守护线程的时候,JVM就可以退出了(如果User Thread全部撤离,那么Daemon Thread也就没啥线程好服务的了,所以虚拟机也就退出了);如果还有一个或以上的非守护线程则不会退出。(以上是针对正常退出,调用System.exit则必定会退出)。
举个例子:就像天上人间的保安 (守护线程),里面有牌位姑娘(非守护线程),他们是可以同时干着各自的活儿,但是 姑娘们要是都被JC带走了,那么门口的保安也就没有存在的意义了。
<怎样创建守护线程>
1、thread.setDaemon(true)必须在thread.start()之前设置,你不能把正在运行的常规线程设置为守护线程,否则会跑出一个IllegalThreadStateException异常,如果线程是守护线程,则isDaemon方法返回true。(备注:这点与守护进程有着明显的区别,守护进程是创建后,让进程摆脱原会话的控制+让进程摆脱原进程组的控制+让进程摆脱原控制终端的控制;所以说寄托于虚拟机的语言机制跟系统级语言有着本质上面的区别)。
2、在Daemon线程中产生的新线程也是Daemon的。 (这一点又是有着本质的区别了:守护进程fork()出来的子进程不再是守护进程,尽管它把父进程的进程相关信息复制过去了,但是子进程的进程的父进程不是init进程,所谓的守护进程本质上说就是“父进程挂掉,init收养,然后文件0,1,2都是/dev/null,当前目录到/”)
3、不是所有的应用都可以分配给Daemon线程来进行服务,比如读写操作或者计算逻辑。因为在Daemon Thread还没来的及进行操作时,虚拟机可能已经退出了。
setDaemon方法的详细说明:
<守护线程调度示例>
//示例1:完成文件输出的守护线程任务 import java.io.*; public class TestDemo { public static void main(String[] args) throws InterruptedException { Runnable tr = new TestRunnable(); Thread thread = new Thread(tr); thread.setDaemon(true); //设置守护线程 thread.start(); //开始执行分进程 } class TestRunnable implements Runnable{ public void run(){ try{ Thread.sleep(1000);//守护线程阻塞1秒后运行 File f=new File("daemon.txt"); FileOutputStream os=new FileOutputStream(f,true); os.write("daemon".getBytes()); } catch(IOException e1){ e1.printStackTrace(); } catch(InterruptedException e2){ e2.printStackTrace(); } } } }
运行结果:文件daemon.txt中没有"daemon"字符串。
但是如果把thread.setDaemon(true); //设置守护线程注释掉,文件daemon.txt是可以被写入daemon字符串的
JRE判断程序是否执行结束的标准是所有的前台执线程行完毕了,而不管后台线程的状态,因此,在使用后台线程候一定要注意这个问题。
//示例2:线程的调度-守护线程
public class Test { public static void main(String[] args) { Thread t1 = new MyCommon(); Thread t2 = new Thread( new MyDaemon()); t2.setDaemon( true); //设置为守护线程 t2.start(); t1.start(); } } class MyCommon extends Thread { public void run() { for ( int i = 0; i < 5; i++) { System.out.println( "线程1第" + i + "次执行!"); try { Thread.sleep(7); } catch (InterruptedException e) { e.printStackTrace(); } } } } class MyDaemon implements Runnable { public void run() { for ( long i = 0; i < 9999999L; i++) { System.out.println( "后台线程第" + i + "次执行!"); try { Thread.sleep(7); } catch (InterruptedException e) { e.printStackTrace(); } } } }
线程1第0次执行!
线程1第1次执行!
后台线程第1次执行!
后台线程第2次执行!
线程1第2次执行!
线程1第3次执行!
后台线程第3次执行!
线程1第4次执行!
后台线程第4次执行!
后台线程第5次执行!
后台线程第6次执行!
后台线程第7次执行!
Process finished with exit code 0
转载于:https://www.cnblogs.com/GISQZC/p/5946189.html
Java中的守护线程和非守护线程(转载)相关推荐
- java守护线程与非守护线程
java守护线程与非守护线程 代码逻辑 当前网上结论 1.主线程结束,守护线程跟着结束 2.只要存在任何一个非守护线程,守护线程就全部工作 测试代码 第一段代码 第二段代码 结论 代码逻辑 代码里面包 ...
- 守护线程与非守护线程的区别
守护线程与非守护线程 最近在看多线程的Timer章节,发现运用到了守护线程,感觉Java的基础知识还是需要补充. Java分为两种线程:用户线程和守护线程 所谓守护线程是指在程序运行的时候在后台提供一 ...
- java的守护进程与非守护进程
java的守护进程与非守护进程 最近重新研究Java基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程: User Thread(用户线程).Daemon Th ...
- 守护线程和非守护线程
直觉上来讲,守护线程和main相关 Java中有两种线程,一种是用户线程,另一种是守护线程. 用户线程是指用户自定义创建的线程,主线程停止,用户线程不会停止(另一条执行路径) 守护线程当进程不存在或主 ...
- 多线程基础-守护线程与非守护线程
守护线程与非守护线程 1.线程分类: 2.程序线程: 3.主线程与非守护线程 4.主线程与守护线程 5.主线程.守护线程.非守护线程 6. java虚拟机是如何退出的? 1.线程分类: 守护线程 非守 ...
- 并发编程之多线程基础-守护线程与非守护线程(四)
守护线程概念: 只要当前JVM实例中尚存在任何一个非守护线程没有结束, 守护线程就全部工作; 只有当最后一个非守护线程结 束时, 守护线程随着 JVM 一同结束工作. 守护线程最典型的应用就是 GC ...
- 守护线程是什么?守护线程和非守护线程的区别是?守护线程的作用是?
守护线程是区别于用户线程,用户线程即我们手动创建的线程,而守护线程是程序运行的时候在后台提供一种通用服务的线程.垃圾回收线程就是典型的守护线程. 守护线程和非守护线程的区别是 public stati ...
- 浅谈 JAVA中静态初始化块和非静态初始化块的区别
众所周知在JAVA编程语言中有两种初始化块: 静态初始化块 非静态初始化块 他们到底有什么区别呢?今天就浅谈一下JAVA中静态初始化块和非静态初始化块的区别 静态初始化块 定义: static{} 执 ...
- SWT的UI线程和非UI线程
为什么80%的码农都做不了架构师?>>> 要理解UI线程,先要了解一下"消息循环"这个概念.链接是百度百科上的条目,简单地说,操作系统把用户界面上的每个操作 ...
最新文章
- c语言连接数据库例子,c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual help).doc...
- WIN7如何替换开机登录画面
- 利用ListView实现新闻客户端的新闻内容图文混排
- Redis进阶 - Redis主从工作原理详解
- Cetos 7 系统安装备注事项
- C++中了类继承和调用父类的构造函数方法
- 股市永不过时的黄金铁律:零下金叉疯狂买,零上死叉立即卖
- linux c 数据库访问框架,linux c 开发通用结构,框架
- python分支结构基础实训_零基础Python教程-分支结构
- java套接字客户端_使用Java从客户端套接字读取数据(Read data from a client socket in Java)...
- javascript闭包原理
- 数据库“意外失联”?华为云DRS异地多活灾备为您支招
- C#语法之---多线程、并发与并行概念总结
- python获取命令行参数_Python获取命令行参数的正确方法,案例详解
- 汇编---3---物理地址
- Python官方中文文档网址和Python标准库官方中文文档网址
- IDEA插件系列(100):CPU Usage Indicator插件——显示CPU使用情况
- 计算机网络flash实训报告,flash动画实训总结精选 .doc
- 新闻APP受到各界关注 趣头条 大众看点 等新闻
- Serverless 架构的 N 种可能,你 Pick 谁?
热门文章
- C语言 串口通知消息,编程模式·观察者模式、事件通知、消息队列三者区别
- python修改文件后缀_python实现遍历文件夹修改文件后缀
- mysql中的竖线怎么用_Mysql event时间触发器,实现定时修改某些符合某一条件的某一字段...
- python测试代码性能_使用python timeit 模块检测代码性能
- 系统接口对接的进度工作应该谁来干_第三方分账系统开发的那些坑,给你节省几十万...
- python特性和属性的区别_什么是属性,什么是特性,有何不同?
- 实现根据条件删除_常见数据结构的实现(一):跳跃表
- 哈工大威海c语言实验报告 第八章 无法运行程序,哈工大威海c语言实验报告.doc...
- 运行报错 Permission denied: user=Admin, access=WRITE, inode=/:root:supergroup:drwxr-xr-x
- mx250 计算能力_熟悉的刀法:英伟达 MX 250 也有 25W 和 10W 两个版本