必威体育Betway必威体育官网
当前位置:首页 > IT技术

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

时间:2019-10-08 12:13:21来源:IT技术作者:seo实验室小编阅读:65次「手机版」
 

守护进程

java守护进程与非守护进程   

最近重新研究java基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程:

User Thread(用户线程)、Daemon Thread(守护线程) ,(PS:以前忽略了)。

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

  Daemon的作用是为其他线程的运行提供服务,比如说GC线程。其实User Thread线程和Daemon Thread守护线程本质上来说去没啥区别的,唯一的区别之处就在虚拟机的离开时候:如果User Thread全部撤离,那么Daemon Thread也就没啥线程好服务的了,所以虚拟机也就退出了。只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。守护线程最典型的应用就是 GC (垃圾回收器)。

  守护线程并非虚拟机内部可以提供,用户也可以自行的设定守护线程,方法:

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请求,然后每个请求过来调度线程从线程池中取出一个工作者线程来处理该请求,从而实现并发控制的目的。

网上摘的一个图,方便大家理解:

参考博文:https://blog.csdn.net/sujianxin2012/article/details/39324755

相关阅读

.java编译成.class 与 .class反编译成.java

了解下这两个文件类型:.java文件是给人看的,.class是给计算机看的。程序员编写的是.java文件,经编译后生成.class文件给计算执行。相

java单例模式

摘要: 本文首先概述了单例模式产生动机,揭示了单例模式的本质和应用场景。紧接着,我们给出了单例模式在单线程环境下的两种经典实现

Java时间HH-mm-ss与hh-mm-ss的区别

日期HH-mm-ss(时-分-秒)为24小时制日期hh-mm-ss(时-分-秒)为12小时制Date dNow = new Date( ); SimpleDateFormat dateFormat = new S

关于导致java.lang.InstantiationException异常的原因

这个异常多半是由于通过反射在实例化的时候,对应的类里面覆盖了无参构造而导致无法实例化,由于创建类的时候,默认有一个无参构造,前提

java 错误:找不到或无法加载主类(jdk1.8)

最近在学习OSGi,想着顺便把java系统地学一下吧。 哪知道环境配置好,第一次code,就报错了。。。在这里记录一下解决方法吧,目前在网上

分享到:

栏目导航

推荐阅读

热门阅读