当前位置: 首页 > news >正文

Android 线程池的面试题 线程线程池面试题

1.为什么要用线程池
降低资源消耗:通过复用线程,降低创建和销毁线程的损耗。
提高响应速度:任务不需要等待线程创建就能立即执行。
提高线程的可管理性:使用线程池可以进行统一的分配、调优和监控。
2. 线程池执行流程(原理)
ThreadPoolExecutor的执行流程(原理)
如果核心线程池没满,就创建新线程来处理任务。
如果核心线程池满了,就将任务加入到阻塞队列。
如果阻塞队列满了,就创建临时线程来处理任务。
如果线程池满了,任务将被拒绝,并按照拒绝策略来处理。
  模拟 10 个任务,配置的核心线程数为 5 、等待队列容量为 100 ,所以每次只可能存在 5 个任务同时执行,剩下的 5 个任务会被放到等待队列中。当前的 5 个任务执行完成后,才会执行剩下的 5 个任务。

面试题: 现有一个线程池,参数corePoolSize = 5,maximumPoolSize = 10,BlockingQueue阻塞队列长度为 5 :

Q:有4个任务同时进来,问:线程池会创建几条线程?

A:执行execute方法会新建 4 条线程来执行任务;

Q:又同时进来 2 个任务呢(总共6个任务了)?

A:会新建 1 条线程来执行任务,这时核心线程池满了,但还剩下1个任务,线程池会将剩下这个任务放进阻塞队列中,等待空闲线程执行。

Q:又同时进来了 5 个任务呢(总共11个任务了)?

A:线程池会继续将这5个任务放进阻塞队列,然后导致阻塞队列满了,此时核心线程也用完了,但还剩下1个任务,于是线程池会创建 1 条“临时”线程来执行这个任务。“临时”指的是他们不会长期存在于线程池,存活时间为 keepAliveTime。

3.有哪些线程池?/ 有哪几种方法创建线程池?(常见的线程池,线程池的种类,线程池的实现类,阻塞队列,缺点)
方式一:通过Executor 框架的工具类Executors来实现:

Executors.newFixedThreadPool()方法返回一个线程数量固定的线程池。超过这个数量后新进来的任务会被放到等待队列中,等线程空闲时,再按先进先出的原则处理队列中的任务。
Executors.newSingleThreadExecutor()方法返回一个只有一个线程的线程池。超过这个数量后新进来的任务会被放到等待队列中,等线程空闲时,再按先进先出的原则处理队列中的任务。
  FixedThreadPool 和 SingleThreadExecutor 使用的都是 LinkedBlockingQueue 作为等待队列,这是一个无界队列,允许请求的队列长度为 Integer.MAX_VALUE ,所以可能堆积大量请求,导致OOM。

Executors.newCachedThreadPool()方法返回一个可根据实际情况调整线程数量的线程池。在核心线程达到最大值之前,有任务进来就会创建新的核心线程,并加入核心线程池。达到最大核心线程数后,新任务进来,如果有空闲线程,就直接拿来使用,如果没有,就放到等待队列中来处理。它使用的是 SynchronousQueue 作为等待队列,所以不会保留任务,直接创建临时线程来处理新任务,允许创建的线程数量为 Integer.MAX_VALUE,所以可能会创建大量线程,导致OOM。
方式二:通过构造方法 ThreadPoolExecutor 自定义参数来实现。
  

4. 线程池需要输入的参数
corePoolSize:表示核心线程池的大小。当提交一个任务时,如果当前线程池的线程个数没有达到corePoolSize,即使有空闲线程,也会创建新的线程来执行所提交的任务。
maximumPoolSize:表示线程池允许创建的最大线程数。如果阻塞队列已满,并且已创建的线程数小于最大线程数,则线程池会创建新的线程执行任务。
workQueue:表示阻塞队列,用于保存等待执行的任务。常用的阻塞队列有:①基于数组结构的有界阻塞队列 ArrayBlockingQueue。②基于链表结构的阻塞队列 LinkedBlockingQueue。③不存储元素的阻塞队列 SynchronousQueue。④具有优先级的阻塞队列 PriorityBlockingQueue。 阻塞队列
keepAliveTime:当线程池中的线程数量大于 corePoolSize 时,如果没有新的任务提交,核心线程外的线程不会立即销毁,而是会等待,直到等待的时间超过了 keepAliveTime 才会被回收销毁。
TimeUnit:表示keepAliveTime的时间单位。
handler:饱和策略(拒绝策略)。当线程池的阻塞队列已满并且线程数量达到了最大线程数,就需要采用拒绝策略来处理新任务。线程池提供了四种拒绝策略:
①AbortPolicy,表示直接抛出异常拒绝处理新任务,它也是默认情况下的策略。
②CallerRunsPolicy:表示用调用者所在的线程来运行任务。如果不能丢弃任何一个任务,就选用这个策略。
③DiscardPolicy:表示丢弃掉无法处理的任务。如果允许任务丢失,这是最好的策略方案。
④DiscardOldestPolicy:表示丢弃掉队列里最旧的未处理的任务。
ThreadFactory:用于设置创建线程的工厂。(可以在自定义的ThreadFactory内将所有线程都设置为守护线程,这样当主线程退出后,会销毁线程池。)
5.线程池中一般设置多少线程?线程池大小如何设置?
(在京东实习中接触的项目,对于线程池参数设置的是核心线程数为5,最大线程数设置的是10,队列大小为1000,因为cpu核数是4,按照经验应该设置为2倍的cpu核数+1,所以应该是9,我们于是设置为10了;队列大小之所以设为1000,是因为我们处理的批次是100,设为1000的话可以放十个批次,而我们的系统处理速度其实是很快的)
对于CPU密集型任务(N+1):尽量使用较小的线程池,一般设置线程池大小为CPU核心数+1。 因为CPU密集型任务使得CPU使用率很高,若开过多的线程,只会增加上下文切换的次数,带来额外的开销。
对于IO密集型任务:由于这类任务对CPU的使用率不高,所以可以设置较大点的线程池,让CPU在等待IO的时候去处理别的任务,充分利用CPU的资源。一般设置为 CPU核心数 乘以 CPU使用率 再乘以 线程等待时间与运行时间的比例加1 得到的值,也就是线程等待时间所占比例越高,就设置越多的线程;线程运行时间所占比例越高,就设置越少的线程。
  CPU核心数 x CPU使用率 x [(线程等待时间 / 线程运行时间) + 1]
(如果线程池设置的太大,大量线程可能会同时争取CPU资源,导致产生大量的上下文切换,而且管理这么多线程,开销也会增大。如果设置太小,同一时间有大量任务需要处理时,就会导致任务在队列中等待执行,大量任务堆积会导致 OOM)
6. 什么是上下文切换?
  当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换回这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。

7.任务队列满了以后再来一个任务如何处理?
  判断线程池运行的线程数量是否达到了最大线程数量。如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则执行拒绝策略。
  

8.如何向线程池提交任务?(execute 方法和 submit 方法的区别)
execute 方法没有返回值,所以无法判断任务是否被线程池执行成功。
submit 方法有返回值,返回一个Future类型的对象,通过这个Future对象可以判断任务是否执行成功。
-----------------------------------
Android 线程池的面试题 线程线程池面试题
https://blog.51cto.com/u_16213577/8724434

相关文章:

Android 线程池的面试题 线程线程池面试题

1.为什么要用线程池 降低资源消耗:通过复用线程,降低创建和销毁线程的损耗。 提高响应速度:任务不需要等待线程创建就能立即执行。 提高线程的可管理性:使用线程池可以进行统一的分配、调优和监控。 2. 线程池执行流程&#xff08…...

Flink时间和窗口

目录 时间语义 水位线(Watermarks) 并行流中的水位线 窗口 滚动窗口—Tumbling Windows 滑动窗口—Sliding Windows 会话窗口—Session Windows 全局窗口—Global Windows 例子 时间语义 如图所示,由事件生成器(Event Pr…...

LLaMA模型量化方法优化:提高性能与减小模型大小

LLaMA模型量化方法优化:提高性能与减小模型大小 LLaMA模型量化方法优化:提高性能与减小模型大小引言新增量化方法性能评估7B模型13B模型 结果分析结论 LLaMA模型量化方法优化:提高性能与减小模型大小 引言 在大型语言模型(LLM)的应用中,模型大小和推理速度一直是关键的挑战。…...

前端CSS实现卡片抽奖效果

引言 在网页设计中,互动元素能够显著提升用户体验,吸引用户的注意力。其中,卡片抽奖效果常用于营销活动、游戏或娱乐场景,通过随机展示不同的卡片来增加趣味性和参与度。本文将详细介绍如何使用HTML和CSS来实现一个简单的卡片抽奖…...

Java在for循环中修改集合

前天看到一篇文章什么?for循环也会出问题?,里面涉及到在for循环中修改集合,想起来自己刚入行的时候就碰到过类似的问题,于是复现了一下文章中的问题,并试验了其它在循环中修改集合的方法。 底层原理参考什…...

Java小白入门到实战应用教程-运算符详解

Java小白入门到实战应用教程-运算符 上节回顾 在上节的内容中我们了解了变量和基本数据类型的内容,现在回顾一下上节课的内容。 声明变量的语法为: 数据类型 变量名; 其中在java中一共有8中基本数据类型,分别是:b…...

secureCRT同时在所有已打开窗口执行命令、mac-os下使用的SecureCRT版本 以及 SecureCRT一段时间不操作没有响应的问题

一、secureCRT命令行工具一次性同时在所有已打开窗口执行命令 公司的服务器比较多,最近因为opcache,上线发布后,需要重启所有的WEB服务器上的php。目前使用的jenkins发布,不过账号安全问题,给jenkins的账号权限受限不能…...

增材制造与智能制造关系

在撰写的增材制造技术与装备书籍中有着明确的描述,增材制造是智能制造的典型范例,是智能制造“类”的实例化过程。这种借助于计算机编程面向对象思想的解释可以更全面的理解增材制造和智能制造的关系。增材制造实例具备了智能制造类的属性,智…...

Google Test 学习笔记(简称GTest)

文章目录 一、介绍1.1 介绍1.2 教程 二、使用2.1 基本使用2.1.1 安装GTest (下载和编译)2.1.2 编写测试2.1.3 运行测试2.1.4 高级特性2.1.5 调试和分析 2.2 源码自带测试用例2.3 TEST 使用2.3.1 TestCase的介绍2.3.2 TEST宏demo1demo2 2.3.3 TEST_F宏2.3…...

不可变集合

定义:就是集合中的内容不可以被修改。 如何获取不可变集合? List、Set、Map类中提供的静态方法of可用来获取不可变集合。 特点:一旦创建完成只可以进行查询,不可以增删改。 细节:Map集合中的of方法只能添加10个键值…...

景区AR导航营销系统:技术解决方案与实施效益分析

随着旅游市场的竞争日益激烈,景区需要不断创新以吸引游客。景区 AR 导航将虚拟画面与现实场景相结合,为游客提供了更加直观、生动的导航服务。对于景区而言,这一创新技术无疑是吸引游客目光、提升景区知名度的有力武器。通过独特的 AR 导航体…...

MATLAB的基础知识

matlab的基本小常识 1. 在每行语句后面加上英文分号表示不在命令行窗口显示运行结果。 a 3; a 5 2. 多行注释快捷键,CTRLR。 3. 取消多行注释,CTRLT。 4. 清空工作区的所有变量使用clear。 5. 清空命令行窗口的所有变量使用clc。 6. clc和clear一起使…...

Redis-高级实战案例

文章目录 Redis集群崩溃时如何保证秒杀系统高可用1. 冗余与备份2. 故障检测与自动切换3. 降级策略4. 数据一致性5. 客户端缓存6. 异常处理与通知7. 测试与演练8. 服务降级与回滚Redis主从切换导致库存同步异常以及超卖问题主从切换导致的库存同步异常原因:解决方案:秒杀链路中…...

d3d12.dll 文件缺失如何解决?五种修复丢失问题的方法

d3d12.dll 文件缺失如何解决?它为什么会不见呢?今天,我们将探讨 d3d12.dll 文件的重要性、原因以及丢失时的解决策略。本文将全面介绍 d3d12.dll 文件,并提供五种修复丢失问题的方法。 d3d12.dll文件是什么的详细介绍 d3d12.dll …...

Linux下如何设置系统定时任务

在Linux系统中,用户可以使用cron工具来设置定时任务。cron是一个守护进程,用于在指定的时间间隔执行指定的命令或脚本。下面是在Linux系统中设置系统定时任务的步骤。 使用crontab命令编辑定时任务列表: crontab -e该命令会打开一个文本编辑…...

【React】JSX 实现列表渲染

文章目录 一、基础语法1. 使用 map() 方法2. key 属性的使用 二、常见错误和注意事项1. 忘记使用 key 属性2. key 属性的选择 三、列表渲染的高级用法1. 渲染嵌套列表2. 条件渲染列表项3. 动态生成组件 四、最佳实践 在 React 开发中,列表渲染是一个非常常见的需求。…...

写一个简单的兼容GET/POST请求的登录接口

本文目录 安装JDK17安装或者更新Intelij Idea 2024SpringBoot生成项目压缩包下载maven,idea添加maven写POST接口浏览器访问GET接口PostMan安装及访问POST接口 安装JDK17 参考:https://blog.csdn.net/tiehou/article/details/129575138 安装或者更新Int…...

【好玩的经典游戏】Docker环境下部署赛车小游戏

【好玩的经典游戏】Docker环境下部署赛车小游戏 一、小游戏介绍1.1 小游戏简介1.2 项目预览二、本次实践介绍2.1 本地环境规划2.2 本次实践介绍三、本地环境检查3.1 安装Docker环境3.2 检查Docker服务状态3.3 检查Docker版本3.4 检查docker compose 版本四、构建容器镜像4.1 下…...

物理机 gogs+jenkins+sonarqube 实现CI/CD

一、部署gogs_0.11.91_linux_amd64.tar.gz gogs官网下载&#xff1a;https://dl.gogs.io/ yum -y install mariadb-serversystemctl start mariadbsystemctl enable mariadbuseradd gittar zxvf gogs_0.11.91_linux_amd64.tar.gzcd gogsmysql -u root -p < scripts/mysql.…...

前端表格解析方法

工具类文件 // fileUtils.tsimport { ref } from vue; import * as xlsx from xlsx;interface RowData {[key: string]: any; }export const tableData ref<RowData[]>([]);export async function handleFileSelect(url: string): Promise<void> {try {const res…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...