Java守护线程学习
2017-03-15 14:55
549 查看
在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 {
@Override
public void run() {
try {
System.out.println("睡眠前 ... ");
Thread.sleep(5000);
System.out.println("睡眠后 ... ");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.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;
}
所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。
用户线程和守护线程两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。
(上文转至: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 {
@Override
public void run() {
try {
System.out.println("睡眠前 ... ");
Thread.sleep(5000);
System.out.println("睡眠后 ... ");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.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;
}
相关文章推荐
- Java并发学习之七——守护线程
- Java进阶学习2-多线程之守护线程
- JAVA学习笔记(四十)- 守护线程与中断线程
- Java学习笔记----------------守护线程
- java学习Java编程:什么是守护线程?
- java学习11--线程创建的两种方式,生命周期以及守护线程
- 玩转java多线程学习篇五 线程的优先级和守护线程
- Java线程(学习整理)--1--守护线程
- java学习初探十八之线程的守护线程
- java多线程学习4,守护线程
- Thread学习之Java中守护线程的总结
- Java并发学习笔记(16)守护线程,线程组
- java基础学习__多线程(停止线程,守护线程,join方法)
- Java线程:线程的调度-守护线程
- java线程初步学习
- Java线程:线程的调度-守护线程
- Java线程学习11.30
- Java线程:线程的调度-守护线程
- java的守护线程
- Java线程之守护线程(Daemon)