您的位置:首页 > 编程语言 > Java开发

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: