Java 守护线程_动力节点Java学院整理

 更新时间:2017年05月26日 15:57:47   投稿:mrr  
Java语言机制是构建在JVM的基础之上的,意思是Java平台把操作系统的底层给屏蔽起来,所以它可以在它自己的虚拟的平台里面构造出对自己有利的机制,而语言或者说平台的设计者多多少少是收到Unix思想的影响,而守护线程机制又是对JVM这样的平台凑合,于是守护线程应运而生

估计学过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还没来的及进行操作时,虚拟机可能已经退出了。

例子:

//完成文件输出的守护线程任务
import java.io.*; 
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(); 
      } 
  } 
} 
public class TestDemo2{ 
  public static void main(String[] args) throws InterruptedException 
  { 
    Runnable tr=new TestRunnable(); 
    Thread thread=new Thread(tr); 
        thread.setDaemon(true); //设置守护线程 
    thread.start(); //开始执行分进程 
  } 
} 

运行结果:文件daemon.txt中没有"daemon"字符串。

但是如果把thread.setDaemon(true); //设置守护线程注释掉,文件daemon.txt是可以被写入daemon字符串的 

  JRE判断程序是否执行结束的标准是所有的前台执线程行完毕了,而不管后台线程的状态,因此,在使用后台线程候一定要注意这个问题。

但是daemon Thread实际应用在那里呢?举个例子,web服务器中的Servlet,容器启动时后台初始化一个服务线程,即调度线程,负责处理http请求,然后每个请求过来调度线程从线程池中取出一个工作者线程来处理该请求,从而实现并发控制的目的。
网上摘的一个图,方便大家理解:

以上所述是小编给大家介绍的Java 守护线程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Mybatis-plus的service通用接口解读

    Mybatis-plus的service通用接口解读

    这篇文章主要介绍了Mybatis-plus的service通用接口解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java时间轮算法的实现代码示例

    Java时间轮算法的实现代码示例

    本篇文章主要介绍了Java时间轮算法的实现代码示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 详解Java synchronized关键字的用法

    详解Java synchronized关键字的用法

    在多线程编程中常常使用锁机制来确保同一时刻只有一个线程能够修改共享内存,在Java中一般是使用synchronized作为锁机制,下面就让我们来学习一下如何使用synchronized实现线程安全吧
    2023-08-08
  • Java教程之引用类型数组和继承的意义详解

    Java教程之引用类型数组和继承的意义详解

    这篇文章主要介绍了Java教程之引用类型数组和继承的意义详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • 基于Transactional事务的使用以及注意说明

    基于Transactional事务的使用以及注意说明

    这篇文章主要介绍了Transactional事务的使用以及注意说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • MyBatis中使用foreach循环的坑及解决

    MyBatis中使用foreach循环的坑及解决

    这篇文章主要介绍了MyBatis中使用foreach循环的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • 深入Sqlite多线程入库的问题

    深入Sqlite多线程入库的问题

    本篇文章是对Sqlite多线程入库的问题进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Java实现双向链表(两个版本)

    Java实现双向链表(两个版本)

    这篇文章主要介绍了Java实现双向链表(两个版本)的相关资料,需要的朋友可以参考下
    2016-02-02
  • 聊聊DecimalFormat的用法及各符号的意义

    聊聊DecimalFormat的用法及各符号的意义

    这篇文章主要介绍了DecimalFormat的用法及各符号的意义,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • java中struts2实现文件上传下载功能

    java中struts2实现文件上传下载功能

    这篇文章主要介绍了java中struts2实现文件上传下载功能的方法,以实例形式分析了struts2文件上传下载功能的实现技巧与相关问题,具有一定的参考借鉴价值,需要的朋友可以参考下
    2016-05-05

最新评论