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