首页 > 技术文章 > 08_控制线程_后台线程(守护线程)

HigginCui 2016-09-24 16:39 原文

【后台线程】

后台线程(Daemon Thread):运行在后台,他的任务是为其它的线程提供服务,又称为"守护线程"。JVM的垃圾回收线程就是典型的后台线程。

[ 特征 ]

如果所有的前台线程都死亡,后台线程会自动死亡。

调用Thread对象的setDaemon(true)方法可以将指定的线程设置成后台线程。

当整个虚拟机中只剩下后台线程时,程序就没有继续运行的必要了,所以虚拟机也就退出了。

Thread类提供了一个isDaemon()方法,用来判断指定线程是否为后台线程。

【示例代码】

package com.Higgin.part02;

class DaemonThread implements Runnable{

    //定义后台线程的形成执行体和普通线程无区别
    @Override
    public void run() {
        for(int i=0;i<1000;i++){
            System.out.println(Thread.currentThread().getName()+"===="+i);
        }
    }
    
}

public class Demo02 {
    public static void main(String[] args) {
        DaemonThread dt=new DaemonThread();
        Thread t1=new Thread(dt,"后台线程");
        t1.setDaemon(true);  //将此线程设置成后台线程!!
        t1.start();  //启动线程
        
        for(int i=0;i<100;i++){
            System.out.println(Thread.currentThread().getName()+"===="+i);
        }
        //main线程运行到for循环结束,就算此时后台线程的执行体for循环未结束 ,也得结束线程!
    }
}

 

【运行结果】

后台线程本来希望运行到i=999的,但是前台唯一的main主线程运行结束了,JVM自动退出,后台线程也会随之结束。

【小结】

从上面的代码看,主线程默认是前台线程,t1线程设置为后台线程。

【注意1】

并不是所有的线程默认都是前台线程,

前台线程创建的子线程默认是前台线程

后台线程创建的子线程默认是后台线程

【注意2】

前台线程死亡后,JVN会通知后台线程死亡,但从它收到指令到做出相应,需要一定的时间,而且要将某个线程设置为后台线程,必须要在该线程启动之前(比如本案例中main()方法的for循环之前),即setDaemon(true)必须在start()方法之前调用,否则会引发IllegalThreadStateException异常。

 

推荐阅读