南昌网站seo费用,自己创建平台要多少钱,做网站切图,网页如何设计跑马灯效果java的守护进程与非守护进程 最近重新研究Java基础知识#xff0c;发现以前太多知识知识略略带过了#xff0c;比较说Java的线程机制#xff0c;在Java中有两类线程#xff1a;
User Thread(用户线程)、Daemon Thread(守护线程) #xff0c;#xff08;PS:以前忽略了发现以前太多知识知识略略带过了比较说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 fnew File(daemon.txt); FileOutputStream osnew 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 trnew TestRunnable(); Thread threadnew 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