守护线程
来源:互联网 发布:爱温士采暖知乎 编辑:程序博客网 时间:2024/06/07 03:26
在Java中有两种线程:用户线程和守护线程(Daemon)。
守护线程有陪伴的含义,当进程中不存在非守护线程,则守护线程自动销毁,典型的守护线程就是垃圾回收线程,当进程中没有非守护线程,则垃圾回收线程也就没有存在的不要了,自动销毁。当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。守护线程的作用就是为其他线程的运行提供便利服务,最典型的的应用就是GC(垃圾回收器),它就是个很称职的守护者。
当一个线程退出时,JVM会检查其他正在运行的线程,如果这些线程都是守护线程,那么JVM会正常退出操作。当JVM停止时,所有任然存在的守护线程都将被抛弃—-既不会执行finally代码块,也不会执行回卷栈,而JVM只是直接退出。—《java concurency practice》。
用户也可以自行的把用户线程设定为守护线程,方法: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还没来的及进行操作时,虚拟机可能已退出了。
JRE判断程序是否执行结束的标准是所有的前台执线程行完毕了,而不管后台线程的状态,因此,在使用后台线程候一定要注意这个问题。
但是daemon Thread实际应用在那里呢?举个例子,web服务器中的Servlet,容器启动时后台初始化一个服务线程,即调度线程,负责处理http请求,然后每个请求过来调度线程从线程池中取出一个工作者线程来处理该请求,从而实现并发控制的目的。
例子:
public class DaemonThread { public static void main(String[] args) { try { MyThread thread = new MyThread(); thread.setDaemon(true); thread.start(); thread.sleep(6000); System.out.println("main线程执行结束了,作为守护线程的thread也就停止了!"); } catch (InterruptedException e) { e.printStackTrace(); } }} class MyThread extends Thread{ private int i = 0; @Override public void run() { try{ while (true) { i++; System.out.println("i=" + (i)); Thread.sleep(1000); } } catch(InterruptedException e){ e.printStackTrace(); } } }
main线程睡眠6秒,thread开始执行,每打印一个i睡眠一秒,打印到第6次后,在这次睡眠时,main线程睡眠接收,继续执行,打印“main线程执行结束了,作为守护线程的thread也就停止了!”后main线程执行结束,于是作为守护线程的thread销毁。
参考文献:
Java多线程编程核心技术
博客园:http://www.cnblogs.com/super-d2/p/3348183.html
- 守护线程、守护进程
- 守护线程
- 守护线程
- 守护线程
- 守护线程
- 守护线程
- 守护线程
- 守护线程
- 守护线程
- 守护线程
- 守护线程
- 守护线程
- 守护线程
- 守护线程
- 守护线程
- 守护线程
- 守护线程
- 守护线程
- 关于“相亲数”的算法实现
- 15. 3Sum
- hdu 6194 恰好出现k次的子串
- 99%的人理解错 HTTP 中 GET 与 POST 的区别
- 廖雪峰python学习笔记(1)--网络编程
- 守护线程
- Serializable 接口与 Java 序列化与反序列化
- leetcode练习 Reverse Pairs
- uva 10168 【素数筛法】
- string string string hdu 6194 (后缀数组做法)
- UVa 11354 Bond 最小生成树+LCA倍增
- GOGOGO
- GPU的选择
- JAVA不使用第三个变量,交换两个变量的值