面试小札:线程池

1 什么是线程池

2 线程池如何工作的?

3 线程和进程有什么区别?

4 描述线程池的工作流程。

5 线程池的拒绝策略有哪些?

6 threadpool executor核心参数有哪些?

一、什么是线程池

线程池是一种多线程处理形式,它可以有效地管理和复用线程,避免频繁地创建和销毁线程所带来的性能开销。

二、线程池如何工作

线程池创建:首先创建一个线程池,指定一些参数,如核心线程数、最大线程数、线程空闲时间等。

任务提交:当有新的任务提交到线程池时,如果线程池中的线程数小于核心线程数,会创建新的线程来执行任务。

线程复用:如果线程数已经达到核心线程数,新的任务会被放入任务队列等待线程空闲时执行。

线程扩充:当任务队列已满,且线程数小于最大线程数,会创建新的线程来执行任务。

线程回收:当线程空闲时间超过指定的时间,且线程数大于核心线程数,多余的线程会被回收。

三、线程和进程的区别

资源分配:进程拥有独立的地址空间和资源,而线程共享所属进程的资源。

调度:进程切换开销较大,线程切换开销较小。

通信:进程间通信较为复杂,线程间通信相对简单。

健壮性:一个进程崩溃一般不会影响其他进程,而一个线程崩溃可能导致整个进程崩溃。

四、线程池的工作流程

创建线程池:通过指定核心线程数、最大线程数、工作队列等参数来创建线程池。

提交任务:调用线程池的 execute 或 submit 方法提交任务。

分配线程执行任务:如果有空闲线程,直接分配执行任务;如果没有空闲线程且线程数小于核心线程数,创建新线程执行;如果线程数达到核心线程数,任务放入工作队列等待。

处理工作队列中的任务:当有线程空闲时,从工作队列中获取任务执行。

扩展线程:如果工作队列已满且线程数小于最大线程数,创建新线程执行任务。

回收线程:当线程空闲时间超过设定值且线程数大于核心线程数,回收多余线程。

五、线程池的拒绝策略

AbortPolicy :直接抛出 RejectedExecutionException 异常,阻止系统正常运行。

CallerRunsPolicy :将任务回退到调用者所在线程执行。

DiscardOldestPolicy :丢弃队列中最旧的未处理任务,然后重新尝试执行当前任务。

DiscardPolicy :直接丢弃任务,不做任何处理。

六、 ThreadPoolExecutor 核心参数

corePoolSize :核心线程数,即使线程空闲也会保留的线程数。

maximumPoolSize :最大线程数。

keepAliveTime :线程空闲时间,超过该时间空闲线程会被回收。

unit : keepAliveTime 的时间单位。

workQueue :用于保存等待执行任务的阻塞队列。

相关推荐
云边有个稻草人几秒前
向量数据库不必单独建一座“烟囱”:谈谈金仓KES的融合数据库架构
后端
数据库技术讲堂3 分钟前
从 GitOps 到数据库变更:NineData 如何打通 CI/CD 的数据库治理链路
java·数据库·ci/cd
晚安code7 分钟前
TransmittableThreadLocal 线程池上下文传递:捕获重放恢复
后端
JoyT7 分钟前
Claude Code 多会话协作:会话间消息与并行开发
后端
深海呐14 分钟前
Java 位运算符的实际应用:不止面试刷题,业务同样能用
java·位运算符·java 位运算·java 开发技巧·状态位设计·java 高阶用法·位运算符实战
2602_9599609215 分钟前
电商场景Java面试:Spring Boot、JVM、Redis、Kafka、微服务与分布式事务考点解析——谢飞机的作死面试记
java·jvm·spring boot·redis·面试题
路多辛18 分钟前
一个 Go 写的全能 AI Agent,讲讲 covo-agent
java·开发语言·golang
杨丰玮41821 分钟前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(四)
java·游戏·计算机外设
IT_陈寒25 分钟前
SpringBoot自动配置的坑,把我整不会了
前端·人工智能·后端
阿沐沐,25 分钟前
PowerShell 里改了 config.toml,Codex CLI 仍用旧值:先分清该改哪一层
java·服务器·数据库·人工智能·ai·ai编程