java多线程之精灵线程/守护线程(Daemon)

Posted 孔子-说

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java多线程之精灵线程/守护线程(Daemon)相关的知识,希望对你有一定的参考价值。

在java中,本身无法使虚拟主机保持活动的线程称为精灵线程Daemon,又称为守护线程,就是运行在程序后台的线程,一般被用于在后台为其它线程提供服务。既然它在后台运行,当前台线程(即主线程,又叫用户线程)运行完,主体程序就结束了,理所当然该后台线程也应该随之结束了。

当一个应用程序的所有非精灵线程停止运行时,即使仍有精灵线程还在运行,该应用程序也将终止,反过来,只要还有非精灵线程在运行,应用程序就不会停止。我们可以通过setDaemon(boolean on)来设置某线程为精灵线程。用isDaemon()来判断某线程是否为精灵线程或守护线程。

注意:要想设置一个线程为精灵守护线程,setDaemon必须在start前调用。 

精灵线程和非精灵线程的区别

/**
 * 子线程
 *
 * @Author kongzi
 */
public class ThreadMark_Child extends Thread {
    public void run(){
        for(int i = 1; i <= 20;i++){
            try{
                Thread.sleep(100);
            } catch (InterruptedException ex){
                ex.printStackTrace();
            }
            System.out.println("子线程 "+i);
        }
    }
}

子线程设置为精灵线程时

/**
 * 主线程/用户线程
 *
 * @Author kongzi
 */
public class MainThread extends Thread{
    public static void main(String [] args){
        ThreadMark_Child tm = new ThreadMark_Child();
        tm.setDaemon(true);// 设置为精灵线程
        tm.start();
        System.out.println("子线程是精灵线程吗?" +tm.isDaemon());
        try{
            Thread.sleep(1000);
        } catch (InterruptedException ex){
            ex.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"已经结束");
    }
}

// 以下是运行结果
子线程是精灵线程吗?true
子线程 1
子线程 2
子线程 3
子线程 4
子线程 5
子线程 6
子线程 7
子线程 8
子线程 9
main已经结束

子线程设置为非精灵线程时

/**
 * 主线程/用户线程
 *
 * @Author kongzi
 */
public class MainThread extends Thread{
    public static void main(String [] args){
        ThreadMark_Child tm = new ThreadMark_Child();
        tm.setDaemon(false);// 设置为非精灵线程
        tm.start();
        System.out.println("子线程是精灵线程吗?" +tm.isDaemon());
        try{
            Thread.sleep(1000);
        } catch (InterruptedException ex){
            ex.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"已经结束");
    }
}

// 以下是运行结果
子线程是精灵线程吗?false
子线程 1
子线程 2
子线程 3
子线程 4
子线程 5
子线程 6
子线程 7
子线程 8
子线程 9
main已经结束
子线程 10
子线程 11
子线程 12
子线程 13
子线程 14
子线程 15
子线程 16
子线程 17
子线程 18
子线程 19
子线程 20

结论

从代码运行结果可以看出来,当子线程设置为精灵线程时,若主线程结束,该精灵线程即使未运行完成也会结束。当子线程设置为非精灵线程时,主线程是否结束不影响非精灵线程的执行。

以上是关于java多线程之精灵线程/守护线程(Daemon)的主要内容,如果未能解决你的问题,请参考以下文章

Java 多线程之守护线程(Daemon)

Java多线程系列---“基础篇”10之 线程优先级和守护线程

Java多线程-线程的优先级(priority)以及守护线程(daemon)

java 多线程-守护线程

JAVA Daemon线程

JAVA - 守护线程(Daemon Thread)