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方法的作用是判断该线程是否为后台线程,在实际开发中偶尔也会用到他们。
本文来自博客园,作者:小陈子博客,转载请注明原文链接:https://www.cnblogs.com/cj8357475/p/16086008.html