Java守护线程学习
来源:互联网 发布:开票软件启动不了 编辑:程序博客网 时间:2024/05/20 03:43
在Java中有两类线程:用户线程 (User Thread)、守护线程 (Daemon Thread)。
所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。
用户线程和守护线程两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。
(上文转至:http://www.cnblogs.com/diyingyun/archive/2011/12/25/2300998.html)
在Java线程中,Thread中有一个daemon标志来标识该线程是否为守护线程,Thread声明为:
public class Thread implements Runnable { /* Make sure registerNatives is the first thing <clinit> does. */ private static native void registerNatives(); static { registerNatives(); } private char name[]; private int priority; private Thread threadQ; private long eetop; /* Whether or not to single_step this thread. */ private boolean single_step; /* Whether or not the thread is a daemon thread. */ private boolean daemon = false; 省略其余代码}
所以线程默认都是非守护线程。当用户线程完毕之后,守护线程会自动结束,例如如下代码:
package com.daxin;class DaemonThread extends Thread {@Overridepublic void run() {try {System.out.println("睡眠前 ... ");Thread.sleep(5000);System.out.println("睡眠后 ... ");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public class DaemonMain {public static void main(String[] args) {DaemonThread dt = new DaemonThread();System.out.println("dt.isDaemon() " + dt.isDaemon());System.out.println("Thread.currentThread().isDaemon() " + Thread.currentThread().isDaemon());dt.setDaemon(true);dt.start();}}
输出:
dt.isDaemon() false
Thread.currentThread().isDaemon() false
睡眠前 ...
永远不会输出:睡眠后 ... ,因为主线程结束之后,子线程也自动随之结束。但是如果不设置子线程为守护线程的话,就会输出:
dt.isDaemon() false
Thread.currentThread().isDaemon() false
睡眠前 ...
睡眠后 ...
最后需要注意的,在设置线程是否为守护线程时必须在启动线程之前完成设置,无法启动之后修改是否为守护线程,setDaemon实现:
public final void setDaemon(boolean on) { checkAccess(); if (isAlive()) {//如果线程启动了,抛出异常 throw new IllegalThreadStateException(); } daemon = on; }
0 0
- Java守护线程学习
- java守护线程(deamon)学习
- java学习Java编程:什么是守护线程?
- java多线程学习4,守护线程
- Java并发学习笔记(16)守护线程,线程组
- JAVA学习笔记(四十)- 守护线程与中断线程
- java守护线程和守护线程
- Java守护线程与非守护线程
- java-守护线程与非守护线程
- JAVA守护线程 非守护线程
- java守护线程和非守护线程
- java守护线程和非守护线程
- java的守护线程
- java守护线程
- java的守护线程
- JAVA中的守护线程
- java 守护线程
- Java守护线程定义
- JAVA基础知识——大数值
- C语言计算 最大公约数
- 【oracle学习】使用Oracle Net Manager过程中出现的问题
- 紫书动规 例题9-5 UVA
- HTML5基础加强css样式篇(target目标伪类选择器)(九)
- Java守护线程学习
- HashMap
- 金额数字变金额大写方法
- C语言中的ASCII、关键字和标识符的应用
- GC的分析与常用GC收集器
- iOS 给文字添加删除线
- JAVA基础知识——数组
- 【HLS】HTTP Live Streaming (HLS)
- Qwt之QwtPlotPicker及其扩展