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

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

Spring数据访问模块设计

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

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...