前言:Java中有两类线程:用户线程和守护线程
其实以前老早就听过守护进程,很少有人提起守护线程;
为什么会出现守护线程?
其实在我理解,这很简单,因为java虚拟机是是java运行的环境,里面的程序运行部依赖外面的环境(比如linux)按照linux 的思维,每个进程都有为止辅助的进程,然而虚拟机可以随意构建出对自己有利的机制,所以守护线程就应运而生;
作用
其实守护线程顾名思义 就是为其他线程提供服务的(比如gc进程)
守护线程不仅虚拟机可以提供,用户也可以制定
- 1、thread.setDaemon(true)必须在thread.start()之前设置,否则会抛出IllegalThreadStateException异常
- 2、在守护线程中产生的新的线程也是守护的
- 3、不是所有的应用都可以分配守护线程的(比如读写操作或者是计算逻辑,因为有可能守护线程还没来得及操作,虚拟机就已经退出了)
一篇好的博客怎么能没有一个栗子呢。。。。
public static void main(String[] args) {
class TestRunnable implements Runnable {
@Override
public void run() {
try {
Thread.sleep(1000);
File f = new File("denme.txt");
FileOutputStream os = new FileOutputStream(f, true);
os.write("deded".getBytes());
} catch (Exception e) {
}
}
}
Runnable r = new TestRunnable();
Thread t = new Thread(r);
t.setDaemon(true);
t.start();
运行结果:文件daemon.txt中没有"daemon"字符串。
但是如果把thread.setDaemon(true); //设置守护线程注释掉,文件daemon.txt是可以被写入daemon字符串的
JRE判断程序是否执行结束的标准是所有的前台执线程行完毕了,而不管后台线程的状态,因此,在使用后台线程候一定要注意这个问题。
但是daemon Thread实际应用在那里呢?举个例子,web服务器中的Servlet,容器启动时后台初始化一个服务线程,即调度线程,负责处理http请求,然后每个请求过来调度线程从线程池中取出一个工作者线程来处理该请求,从而实现并发控制的目的。
image.png
网友评论