当前位置: 首页 > 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…...

Leetcode 3227. Vowels Game in a String

Leetcode 3227. Vowels Game in a String 1. 解题思路2. 代码实现 题目链接&#xff1a;3227. Vowels Game in a String 1. 解题思路 这一题稍微分析一下之后就会发现&#xff0c;这个游戏有且只有一种情况Bob才能够赢&#xff0c;即原始字符串当中不存在元音字母的情况&…...

树莓派4B从装系统raspbian到vscode远程编程(python)

1、写在前面 前面用的一直是Ubuntu系统&#xff0c;但是遇到一个奇葩的问题&#xff1a; 北通手柄在终端可以正常使用&#xff0c;接收到数据 但在python程序中使用pygame库初始化时总是报错&#xff1a;Invalid device number&#xff0c;检测不到手柄 经过n次重装系统&am…...

vue上传Excel文件并直接点击文件列表进行预览

本文主要内容&#xff1a;用elementui的Upload 组件上传Excel文件&#xff0c;上传后的列表采用xlsx插件实现点击预览表格内容效果。 在项目中可能会有这样的需求&#xff0c;有很多种方法实现。但是不想要跳转外部地址&#xff0c;所以用了xlsx插件来解析表格&#xff0c;并展…...

OpenCV 像素操作—证件照换底色详细原理 C++纯手写实现

文章目录 总体步骤1.RGB转HSV2.找出要换的底色3.取反&#xff0c;黑白颠倒4.将原图像的非背景部分复制到新背景上 完整代码1.C纯手写版2.官方API版本 总体步骤 1.RGB转HSV 为什么一定要转为HSV 颜色空间&#xff1f; 将图像从BGR颜色空间转换为HSV颜色空间是因为HSV颜色空间更…...

tinygrad框架简介;MLX框架简介

目录 tinygrad框架简介 MLX框架简介 LLaMA​编辑 Stable Diffusion​编辑 tinygrad框架简介 极简主义与易扩展性 tinygrad 的设计理念是极简主义。与 XLA 类比,如果 XLA 是复杂指令集计算 (CISC),那么 tinygrad 就是精简指令集计算 (RISC)。这种简约的设计使得它成为添加…...

服务器重启了之后就卡在某个页面了,花屏,如何解决??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…...

Hospital 14.6.0全开源医院管理预约系统源码

InfyHMS 具有 60 种功能和 9 种不同类型的用户类型&#xff0c; 他们可以登录系统并根据他们的角色访问他们的数据。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89580674 更多资源下载&#xff1a;关注我。...

C/C++樱花树代码

目录 写在前面 系列文章 C简介 完整代码 代码分析 写在后面 写在前面 C实现精美的樱花树&#xff0c;只需这100行代码&#xff01; 系列文章 序号目录直达链接1爱心代码https://want595.blog.csdn.net/article/details/1363606842李峋同款跳动的爱心https://want595.b…...

sklearn基础学习

1. 简介 1.1 什么是sklearn sklearn&#xff0c;或者更正式地称为scikit-learn&#xff0c;是一个基于Python的开源机器学习库。它建立在NumPy、SciPy和matplotlib之上&#xff0c;提供了简单而有效的工具用于数据挖掘和数据分析。sklearn支持监督学习和无监督学习算法&#…...

SpringBoot 自动配置原理

一、Condition Condition 是在 Spring 4.0 增加的条件判断功能&#xff0c;通过这个可以功能可以实现选择性的创建 Bean 操 作。 思考&#xff1a; SpringBoot 是如何知道要创建哪个 Bean 的&#xff1f;比如 SpringBoot 是如何知道要创建 RedisTemplate 的&#xff1f; …...