11.后台线程(Daemon)的作用


 

 

后台线程(Daemon)的作用

 导言

如果想让某个线程随着主线程的结束而结束,该如何做?例如线程a如何随着主线程的结束而结束。解决这个问题,我们可以将线程a设置为后台线程,这样线程就会随着主线段的结束而结束。

 

下面我们将从2点来介绍后台线程。

第一点设置后台线程。

第二点判断线程是否为后台线程。

设置后台线程

首先来看第一点,我们可以使用thread的类里面的setdaemon方法,它的作用就是设置该线程是否为后台线程,

它只有一个参数on,当他为true 时设置线程为后台线程,当他为false时设置县城不为后台线程。当线程死亡时,再这样setdaemon方法就会引发非法线程状态异常。

因为死亡的线程已经执行结束,它无法再被设置为后台线程。

演示

下面来演示该方法,首先制定一个打印任务,任务的内容是无限打印正在运行这句话,然后来执行该任务。

 

PrintTask 

 

package com.chenjie.executor.day11;

/**
 * packageName com.chenjie.executor.day09
 *
 * @author chenjie
 * @version JDK 8
 * @className PringTask (此处以class为例)
 * @date 2024/5/27
 * @description TODO
 */
public class PrintTask implements Runnable{
    @Override
    public void run() {
        while (true){
            System.out.println("正在执行了");
        }
    }
}
Main 

首先将任务创建出来,然后创建线程接着将任务传递给线程,再接着将该线程设置为后台线程。当主线程运行结束后,该线程结束。接着启动线程
package com.chenjie.executor.day11;


/**
 * packageName com.chenjie.executor.day09
 *
 * @author chenjie
 * @version JDK 8
 * @className Main1 (此处以class为例)
 * @date 2024/5/27
 * @description TODO
 */
public class Main {

    /**
     * 线程设置daemon=true,主线程一秒钟后结束,子线程也结束
     * @param args
     */
    public static void main(String[] args) {
       PrintTask pringTask = new PrintTask();
        Thread thread=new Thread(pringTask);
        //设置该线程为后台线程
        thread.setDaemon(true);
        thread.start();
        try {
            Thread.sleep(1000L);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("结束方法");
    }
}

 

为了让后台线程效果更明显,使主线程消灭一秒钟后结束,sleep方法有异常,try catch捕获。

结果

从运行结果来看,当主线程运行结束后,后台线程也运行结束,至此第一节解释完毕。

判断线程是否为后台线程

再来看第二点,判断线程是否为后台线程,isDaemon方法的作用就是判断线程是否为后台线程,他返回一个布尔类型的结果,当该线程为后台线程返回true,否则返回false,

下面来演示该方法,修改之前的打印任务,删除打印语句,

PrintTask

package com.chenjie.executor.day11;

/**
 * packageName com.chenjie.executor.day09
 *
 * @author chenjie
 * @version JDK 8
 * @className PringTask (此处以class为例)
 * @date 2024/5/27
 * @description TODO
 */
public class PrintTask implements Runnable{
    @Override
    public void run() {
        while (true){
//            System.out.println("正在执行了");
        }
    }
}

再来修改之前的main方法,删除sleep方法,然后在setDaemon方法之前输出该线程是否为后台线程,接着在setDaemon方法之后也输出该线程是否为后台线程。 

Main1

package com.chenjie.executor.day11;


/**
 * packageName com.chenjie.executor.day09
 *
 * @author chenjie
 * @version JDK 8
 * @className Main1 (此处以class为例)
 * @date 2024/5/27
 * @description TODO
 */
public class Main1 {

    /**
     *
     * @param args
     */
    public static void main(String[] args) {
       PrintTask pringTask = new PrintTask();
        Thread thread=new Thread(pringTask);
        System.out.println("thread daemon="+thread.isDaemon());

        //设置该线程为后台线程
        thread.setDaemon(true);
        thread.start();
        System.out.println("thread daemon="+thread.isDaemon());

        try {
            Thread.sleep(1000L);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("结束方法");
    }
}

运行结果

从运行结果来看,thread的线程设置前不是后台线程,设置后置后台线程。

 总结

最后来总结一下本节的内容。本节介绍了thread类里面的两个方法,分别是setdaemon和isdaemon,它们都是非静态方法,setdaemon方法的作用是设置线程是否为后台线程,isdaemon方法的作用是判断该线程是否为后台线程,在实际开发中偶尔也会用到他们。 

posted @ 2022-04-26 22:51  小陈子博客  阅读(1153)  评论(0编辑  收藏  举报