面试突击:什么是守护线程?它和用户线程有什么区别?

您所在的位置:网站首页 什么是环路的跟踪状态它和锁定状态有什么区别 面试突击:什么是守护线程?它和用户线程有什么区别?

面试突击:什么是守护线程?它和用户线程有什么区别?

2024-07-17 02:01:43| 来源: 网络整理| 查看: 265

在 Java 语言中,线程分为两类:用户线程和守护线程,默认情况下我们创建的线程或线程池都是用户线程,所以用户线程也被称之为普通线程。

想要查看线程到底是用户线程还是守护线程,可以通过 Thread.isDaemon() 方法来判断,如果返回的结果是 true 则为守护线程,反之则为用户线程。

我们来测试一下默认情况下线程和线程池属于哪种线程类型?测试代码如下:

import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * 线程类型:守护线程 OR 用户线程 */ public class ThreadType { public static void main(String[] args) { // 创建线程 Thread thread = new Thread(new Runnable() { @Override public void run() { //... } }); // 创建线程池 ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 10, 0, TimeUnit.SECONDS, new LinkedBlockingQueue(100)); threadPool.submit(new Runnable() { @Override public void run() { System.out.println("ThreadPool 线程类型:" + (Thread.currentThread().isDaemon() == true ? "守护线程" : "用户线程")); } }); System.out.println("Thread 线程类型:" + (thread.isDaemon() == true ? "守护线程" : "用户线程")); System.out.println("main 线程类型:" + (Thread.currentThread().isDaemon() == true ? "守护线程" : "用户线程")); } }

以上程序的执行结果如下图所示:

从上述结果可以看出,默认情况下创建的线程和线程池都是用户线程。

守护线程定义

守护线程(Daemon Thread)也被称之为后台线程或服务线程,守护线程是为用户线程服务的,当程序中的用户线程全部执行结束之后,守护线程也会跟随结束。守护线程的角色就像“服务员”,而用户线程的角色就像“顾客”,当“顾客”全部走了之后(全部执行结束),那“服务员”(守护线程)也就没有了存在的意义,所以当一个程序中的全部用户线程都结束执行之后,那么无论守护线程是否还在工作都会随着用户线程一块结束,整个程序也会随之结束运行。

创建守护线程

我们可以通过 Thread.setDaemon(true) 方法将线程设置为守护线程,比如以下代码的实现:

public static void main(String[] args) { Thread thread = new Thread(new Runnable() { @Override public void run() { //... } }); // 设置线程为守护线程 thread.setDaemon(true); System.out.println("Thread 线程类型:" + (thread.isDaemon() == true ? "守护线程" : "用户线程")); System.out.println("main 线程类型:" + (Thread.currentThread().isDaemon() == true ? "守护线程" : "用户线程")); }

以上程序的执行结果如下图所示:

将线程池设置为守护线程

要把线程池设置为守护线程相对来说麻烦一些,需要将线程池中的所有线程都设置成守护线程,这个时候就需要使用线程工厂 ThreadFactory 来设置了(线程池中的所有线程都是通过线程工厂创建的),它的具体实现代码如下:

public static void main(String[] args) throws InterruptedException { // 线程工厂(设置守护线程) ThreadFactory threadFactory = new ThreadFactory() { @Override public Thread newThread(Runnable r) { Thread thread = new Thread(r); // 设置为守护线程 thread.setDaemon(true); return thread; } }; // 创建线程池 ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10, 10, 0, TimeUnit.SECONDS, new LinkedBlockingQueue(100), threadFactory); threadPool.submit(new Runnable() { @Override public void run() { System.out.println("ThreadPool 线程类型:" + (Thread.currentThread().isDaemon() == true ? "守护线程" : "用户线程")); } }); Thread.sleep(2000); }

以上程序的执行结果如下图所示:

守护线程 VS 用户线程

通过前面的内容我们了解了什么是用户线程和守护线程了,那二者有什么区别呢?接下来我们用一个小示例来观察一下。接下来我们将创建一个线程,分别将这个线程设置为用户线程和守护线程,在每个线程中执行一个 for 循环,总共执行 10 次信息打印,每次打印之后休眠 100 毫秒,来观察程序的运行结果。

用户线程

新建的线程默认就是用户线程,因此我们无需对线程进行任何特殊的处理,执行 for 循环即可(总共执行 10 次信息打印,每次打印之后休眠 100 毫秒),实现代码如下:

public static void main(String[] args) throws InterruptedException { // 创建用户线程 Thread thread = new Thread(new Runnable() { @Override public void run() { for (int i = 1; i


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭