<什么是守护线程,什么是非守护线程>

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带走了,那么门口的保安也就没有存在的意义了。

<怎样创建守护线程>

守护线程与普通线程写法上基本没什么区别,调用线程对象的方法setDaemon(true),则可以将其设置为守护线程。
       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();  }  }  }
}

运行结果:
/***********************************
后台线程第0次执行!  
线程1第0次执行!  
线程1第1次执行!  
后台线程第1次执行!  
后台线程第2次执行!  
线程1第2次执行!  
线程1第3次执行!  
后台线程第3次执行!  
线程1第4次执行!  
后台线程第4次执行!  
后台线程第5次执行!  
后台线程第6次执行!  
后台线程第7次执行!  
Process finished with exit code 0
**********************************/

从上面的执行结果可以看出:
前台线程是保证执行完毕的,后台线程还没有执行完毕就退出了(当前线程全是守护线程时,JVM将退出)。
---------------------------------------------------------------------------------------
注:本文转载于:http://blog.csdn.net/wjh5240313226/article/details/51501941,感谢原文作者。

转载于:https://www.cnblogs.com/GISQZC/p/5946189.html

Java中的守护线程和非守护线程(转载)相关推荐

  1. java守护线程与非守护线程

    java守护线程与非守护线程 代码逻辑 当前网上结论 1.主线程结束,守护线程跟着结束 2.只要存在任何一个非守护线程,守护线程就全部工作 测试代码 第一段代码 第二段代码 结论 代码逻辑 代码里面包 ...

  2. 守护线程与非守护线程的区别

    守护线程与非守护线程 最近在看多线程的Timer章节,发现运用到了守护线程,感觉Java的基础知识还是需要补充. Java分为两种线程:用户线程和守护线程 所谓守护线程是指在程序运行的时候在后台提供一 ...

  3. java的守护进程与非守护进程

    java的守护进程与非守护进程 最近重新研究Java基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程: User Thread(用户线程).Daemon Th ...

  4. 守护线程和非守护线程

    直觉上来讲,守护线程和main相关 Java中有两种线程,一种是用户线程,另一种是守护线程. 用户线程是指用户自定义创建的线程,主线程停止,用户线程不会停止(另一条执行路径) 守护线程当进程不存在或主 ...

  5. 多线程基础-守护线程与非守护线程

    守护线程与非守护线程 1.线程分类: 2.程序线程: 3.主线程与非守护线程 4.主线程与守护线程 5.主线程.守护线程.非守护线程 6. java虚拟机是如何退出的? 1.线程分类: 守护线程 非守 ...

  6. 并发编程之多线程基础-守护线程与非守护线程(四)

    守护线程概念: 只要当前JVM实例中尚存在任何一个非守护线程没有结束, 守护线程就全部工作; 只有当最后一个非守护线程结 束时, 守护线程随着 JVM 一同结束工作. 守护线程最典型的应用就是 GC ...

  7. 守护线程是什么?守护线程和非守护线程的区别是?守护线程的作用是?

    守护线程是区别于用户线程,用户线程即我们手动创建的线程,而守护线程是程序运行的时候在后台提供一种通用服务的线程.垃圾回收线程就是典型的守护线程. 守护线程和非守护线程的区别是 public stati ...

  8. 浅谈 JAVA中静态初始化块和非静态初始化块的区别

    众所周知在JAVA编程语言中有两种初始化块: 静态初始化块 非静态初始化块 他们到底有什么区别呢?今天就浅谈一下JAVA中静态初始化块和非静态初始化块的区别 静态初始化块 定义: static{} 执 ...

  9. SWT的UI线程和非UI线程

    为什么80%的码农都做不了架构师?>>>    要理解UI线程,先要了解一下"消息循环"这个概念.链接是百度百科上的条目,简单地说,操作系统把用户界面上的每个操作 ...

最新文章

  1. c语言连接数据库例子,c语言操作mysql数据库小例子_互帮互助(C language MySQL database operation example _ mutual help).doc...
  2. WIN7如何替换开机登录画面
  3. 利用ListView实现新闻客户端的新闻内容图文混排
  4. Redis进阶 - Redis主从工作原理详解
  5. Cetos 7 系统安装备注事项
  6. C++中了类继承和调用父类的构造函数方法
  7. 股市永不过时的黄金铁律:零下金叉疯狂买,零上死叉立即卖
  8. linux c 数据库访问框架,linux c 开发通用结构,框架
  9. python分支结构基础实训_零基础Python教程-分支结构
  10. java套接字客户端_使用Java从客户端套接字读取数据(Read data from a client socket in Java)...
  11. javascript闭包原理
  12. 数据库“意外失联”?华为云DRS异地多活灾备为您支招
  13. C#语法之---多线程、并发与并行概念总结
  14. python获取命令行参数_Python获取命令行参数的正确方法,案例详解
  15. 汇编---3---物理地址
  16. Python官方中文文档网址和Python标准库官方中文文档网址
  17. IDEA插件系列(100):CPU Usage Indicator插件——显示CPU使用情况
  18. 计算机网络flash实训报告,flash动画实训总结精选 .doc
  19. 新闻APP受到各界关注 趣头条 大众看点 等新闻
  20. Serverless 架构的 N 种可能,你 Pick 谁?

热门文章

  1. C语言 串口通知消息,编程模式·观察者模式、事件通知、消息队列三者区别
  2. python修改文件后缀_python实现遍历文件夹修改文件后缀
  3. mysql中的竖线怎么用_Mysql event时间触发器,实现定时修改某些符合某一条件的某一字段...
  4. python测试代码性能_使用python timeit 模块检测代码性能
  5. 系统接口对接的进度工作应该谁来干_第三方分账系统开发的那些坑,给你节省几十万...
  6. python特性和属性的区别_什么是属性,什么是特性,有何不同?
  7. 实现根据条件删除_常见数据结构的实现(一):跳跃表
  8. 哈工大威海c语言实验报告 第八章 无法运行程序,哈工大威海c语言实验报告.doc...
  9. 运行报错 Permission denied: user=Admin, access=WRITE, inode=/:root:supergroup:drwxr-xr-x
  10. mx250 计算能力_熟悉的刀法:英伟达 MX 250 也有 25W 和 10W 两个版本