线程池与 Executor 框架

共 118 题
#

1. 线程池任务排队时间与执行时间如何分开观测,队列深度上涨时应先调整 corePoolSize 还是队列容量

A 关停
B
C 调大 corePoolSize/maxPoolSize ✓ 正确答案
D 调队列容量
#

2. 用 PriorityBlockingQueue 作为 workQueue 时,高优先级任务在池饱和阶段为何仍可能被延迟,如何评估公平性代价

A
B 可能被拒绝或需等运行中任务完成 ✓ 正确答案
C 一定优先
D 抢占
#

3. ForkJoinPool.commonPool 与业务隔离线程池在并行流下的资源竞争与饥饿问题如何排查

A 更快
B 其他并行流饥饿(无线程可用) ✓ 正确答案
C
D 自动扩容
#

4. ForkJoinTask 的 fork()/join() 在并行递归场景下的栈管理

A 工作窃取(work-stealing) ✓ 正确答案
B 传统栈
C
D 阻塞
#

5. ForkJoinTask.join() 在线程池饱和时是否会引发递归线程饥饿,如何用 ManagedBlocker 缓解

A 加锁
B
C 自旋
D ManagedBlocker ✓ 正确答案
#

6. Hystrix/Resilience4j 的线程池隔离与信号量隔离对比

A 线程池隔离 ✓ 正确答案
B 信号量
C 都一样
D
#

7. JDK 25 中 Executors.newVirtualThreadPerTaskExecutor() 与传统平台线程池的并发模型差异

A
B 混合
C CPU 密集
D IO 密集(大量阻塞) ✓ 正确答案
#

8. 线程池任务执行超时如何兜底,Future.get(timeout) 与任务自身取消在池内线程占用上的区别

A 立即释放
B 移除
C 仍被占用直到任务实际完成 ✓ 正确答案
D
#

9. 线程池队列使用 SynchronousQueue 与 LinkedBlockingQueue 在吞吐和背压上的差异,什么场景必须用 SynchronousQueue

A PriorityQueue
B SynchronousQueue ✓ 正确答案
C
D LinkedBlockingQueue
#

10. 线程池线程饥饿与任务死锁的区分方法,任务内提交子任务到同一池时为何容易互相等待

A 自动扩容
B
C 父任务等子任务、子任务等线程,互相等待 ✓ 正确答案
D 更快
#

11. MDC/TraceId 等基于 ThreadLocal 的上下文为何不会自动传到线程池任务中,如何用装饰器或 TransmittableThreadLocal 透传

A TransmittableThreadLocal 或装饰器透传 ✓ 正确答案
B 静态变量
C 普通 ThreadLocal
D
#

12. Tomcat 容器线程池与业务线程池为何要做隔离,业务池阻塞或耗尽时如何反向影响 HTTP 请求处理

A
B 无隔离
C 容器线程立即满
D 容器线程仍可接收请求,但请求等待业务池,RT 上升 ✓ 正确答案
#

13. 为不同业务配置独立线程池时,HTTP 请求线程池与后台任务线程池应当如何在隔离性、弹性与资源利用之间权衡

A 资源利用低(线程闲置) ✓ 正确答案
B
C 更快
D 隔离差
#

14. 为线程池配置自定义 RejectedExecutionHandler 时,DB 限流场景下"调用方阻塞重试"与"CallerRunsPolicy"如何避免反向雪崩

A 加速
B 让提交线程执行任务,自然减速 ✓ 正确答案
C 丢弃任务
D
#

15. 线程池中任务抛出的异常与 rejected 任务分别记录在哪些位置,如何设计统一的失败追踪

A 线程内
B GC
C
D RejectedExecutionHandler 中 ✓ 正确答案
#

16. 线程池任务中执行阻塞 I/O 与计算任务混用时,线程数设定应以哪种任务为主,如何防止慢任务拖垮整体

A 混在一起
B 只算计算
C
D 分离到不同池,避免阻塞占线程 ✓ 正确答案
#

17. 线程池任务执行顺序在 FIFO 队列下如何受线程数影响,批量任务的分批提交策略如何设计

A 完成顺序
B
C 全部
D 出队顺序,不保证完成顺序 ✓ 正确答案
#

18. 如何在大流量场景下避免线程池任务排队时 park/unpark 带来的隐性开销,从而减少 P99 延迟抖动

A 加锁
B 加线程
C 减少队列空转与唤醒频率 ✓ 正确答案
D
#

19. 如何评估 Tomcat 工作线程数与下游业务线程池、连接池容量的匹配关系,避免线程在等待中被占满

A 加线程
B 无超时
C
D 保证各层容量匹配并设连接获取超时 ✓ 正确答案
#

20. 每个 Worker 持有一个 Thread 与一个 firstTask,引入可继承 ThreadLocal 在任务结束后未清理会产生什么后果

A
B 内存增长
C 更快
D 下一个任务读到脏数据(上下文串扰) ✓ 正确答案
#

21. 监控线程池的活跃线程数与队列长度时,哪些 Prometheus 指标(thread_pool_*)最直接反映系统瓶颈

A 内存
B
C 活跃线程接近 max 且队列持续增长 ✓ 正确答案
D 线程数
#

22. 线程池与信号量组合限流时,池内线程与信号量许可分别约束什么,双上限如何防止任务堆积

A 销毁
B 准入控制,防止任务无限堆积 ✓ 正确答案
C 执行
D
#

23. 突发流量下任务提交路径的判定顺序如何决定实际并发上限

A 拒绝
B 入队 ✓ 正确答案
C 扩线程
D
#

24. 线程池队列容量与拒绝策略如何设计以形成背压,队列过长与过短的成本如何权衡?

A 任务堆积、延迟增大、掩盖故障 ✓ 正确答案
B
C 更快
D 省内存
#

25. StructuredTaskScope(JEP 453)在多虚拟线程任务编排中如何保证子任务异常传播与整体失败语义

A 忽略
B 继续
C 取消其他子任务并整体失败 ✓ 正确答案
D
#

26. 线程池与协程(虚拟线程)的取舍

A 任意
B 虚拟线程
C
D 线程池(+信号量) ✓ 正确答案
#

27. 结构化并发 vs 虚拟线程 vs 响应式

A 相同
B 无关
C 互补(结构化并发编排,虚拟线程承载) ✓ 正确答案
D 互斥
#

28. JDK 21 引入虚拟线程后,传统 ThreadPool 的"池大小 = CPU 数 + I/O 系数"经验公式在哪些场景下仍成立,哪些场景应彻底切换

A 仍适用
B 作废(虚拟线程无需池化) ✓ 正确答案
C
D 更复杂
#

29. 线程池的七参数与执行流程,核心线程、队列、最大线程、拒绝策略如何组合?

A 拒绝
B 等待
C
D 创建非核心线程执行 ✓ 正确答案
#

30. 如何监控线程池状态(活跃线程/队列积压/拒绝次数)并动态调整参数?

A shutdown
B
C setCorePoolSize ✓ 正确答案
D 重建
#

31. 线程池与 Thread.UncaughtExceptionHandler 配合时,为什么任务内吞掉的异常不会触发 Handler,如何通过包装 Runnable 解决

A
B 延迟
C 触发
D 不触发(已被捕获) ✓ 正确答案
#

32. 线程池参数动态调整(setCorePoolSize 等)

A 立即中断
B
C 空闲超时后回收 ✓ 正确答案
D 永久
#

33. 线程池参数调优的工程经验(CPU 密集/IO 密集公式)

A 核数 × (1 + 等待时间/执行时间) ✓ 正确答案
B
C 无限
D 核数
#

34. 线程池在 Spring TaskExecutor 中的配置

A Executors
B ThreadPoolExecutor
C
D ThreadPoolTaskExecutor ✓ 正确答案
#

35. 线程池的 RejectedExecutionHandler 自定义日志收集

A 记录被拒任务与池状态,集成日志/告警 ✓ 正确答案
B 阻塞
C
D 加速
#

36. 线程池的 Worker 模型与任务执行流程

A
B 循环从队列取任务执行 ✓ 正确答案
C 阻塞
D 创建线程
#

37. 线程池的 Worker 模型在 setCorePoolSize 动态调整时的锁竞争与可见性如何保证

A
B synchronized
C 原子
D mainLock(ReentrantLock) ✓ 正确答案
#

38. 线程池的 allowCoreThreadTimeOut 在 core 线程空闲超过 keepAliveTime 后被回收,对长生命周期任务池的设计取舍是什么

A 保持核心线程(false),避免频繁重建 ✓ 正确答案
B allowCoreThreadTimeOut=true
C 回收
D
#

39. 线程池的 execute 与 submit 差异

A
B 任意
C execute
D submit ✓ 正确答案
#

40. 线程池的线程名前缀(ThreadFactory)与监控埋点

A 线程 dump/日志中识别归属 ✓ 正确答案
B 加速
C
D 省内存
#

41. 线程池的预热(prestartCoreThread)与按需扩容

A 省资源
B
C 回收
D 避免首任务创建线程的延迟 ✓ 正确答案
#

42. 线程池监控 MXBean.getThreadPool* 指标在告警阈值设定的工程经验有哪些

A 加速
B 正常
C
D 容量不足,应立即告警 ✓ 正确答案
#

43. 线程池隔离(业务隔离池)与任务混合的取舍

A 故障隔离(一个业务不拖累其他) ✓ 正确答案
B 更快
C 资源利用高
D
#

44. 线程池中任务导致 StackOverflowError 时该 Worker 线程会怎样,线程池如何继续服务其他任务

A 捕获后继续执行下一个任务
B 终止,线程池补充新线程继续服务 ✓ 正确答案
C
D 死锁
#

45. 线程池任务的取消与中断传播,shutdownNow 如何中断空闲与运行中线程,任务应如何响应中断

A 队列中未执行的任务列表 ✓ 正确答案
B 已完成任务
C 线程
D
#

46. 线程池任务的延迟执行与超时取消,schedule 与 submit 组合实现定时提交的边界

A schedule ✓ 正确答案
B submit
C
D execute
#

47. 线程池任务粘滞性,同一业务键的任务如何保证顺序执行,分区队列与单线程 worker 的实现取舍

A
B 全局并发
C 分区队列/按 key 分派单线程 ✓ 正确答案
D 随机线程
#

48. 线程池任务执行中的锁等待时间如何统计,JFR 的 jdk.JavaMonitorEnter 事件如何定位池内锁竞争

A
B jdk.GC
C jdk.JavaMonitorEnter ✓ 正确答案
D jdk.ClassLoad
#

49. 线程池的队列容量与任务丢弃策略在削峰场景如何配合,丢弃任务的补偿机制如何设计

A 记录到 MQ/重试队列异步补处理 ✓ 正确答案
B 强制执行
C 加速
D
#

50. 线程池任务依赖外部服务时,池内线程等待下游超时会导致什么连锁问题,如何用并行度与超时上限保护

A 加线程
B
C 设超时上限 + 限制并行度 + 熔断 ✓ 正确答案
D 无限等待
#

51. 线程池线程的 CPU 亲和性绑定(Thread Affinity)在 Java 中的可行性,虚拟线程下为何不再适用

A
B 必须
C 可行
D 不适用(虚拟线程在载体间迁移) ✓ 正确答案
#

52. AbstractExecutorService 的 submit 默认实现

A Runnable
B Callable
C FutureTask(RunnableFuture) ✓ 正确答案
D
#

53. BlockingDeque(LinkedBlockingDeque)的工作窃取应用

A
B 两端操作(本地取、窃取他端) ✓ 正确答案
C 阻塞
D 单端
#

54. 线程池中任务的批量分片执行,FixedThreadPool 与分片游标如何配合实现并行消费

A 随机
B 原子游标(getAndIncrement) ✓ 正确答案
C
D
#

55. 线程池饱和时的降级路径设计,消息队列缓冲、同步降级与快速失败各自适用什么场景

A
B 同步
C 快速失败
D 消息队列缓冲 ✓ 正确答案
#

56. CompletionService(ExecutorCompletionService)的批量提交

A 最早提交
B
C 最早完成的任务结果 ✓ 正确答案
D 最慢
#

57. 线程池的线程数调整在 Kubernetes 容器 CPU 限额下的实践,可用处理器数如何被容器感知并影响默认并行度

A 容器 CPU 配额(容器感知) ✓ 正确答案
B
C 内存
D 宿主机核数
#

58. ExecutorService.invokeAll/invokeAny 的批量任务

A invokeAny ✓ 正确答案
B invokeAll
C execute
D
#

59. ExecutorService.shutdownNow 返回的 Runnable 列表用途

A 运行中
B
C 已完成
D 未开始执行的任务 ✓ 正确答案
#

60. ForkJoinPool 在 JDK 21+ 中支持虚拟线程模式后,CPU-bound 任务与 I/O-bound 任务的并行策略是否有本质变化

A 更并行
B 仍受核数限制,无本质变化 ✓ 正确答案
C
D 无限
#

61. ForkJoinPool 在 Stream 并行流中的角色

A ForkJoinPool.commonPool ✓ 正确答案
B
C 单线程
D 自定义
#

62. ForkJoinPool 工作窃取(Work-Stealing)在多核 CPU 与 NUMA 架构下的性能特征

A 省内存
B 跨节点窃取导致远程内存访问延迟 ✓ 正确答案
C
D 更快
#

63. ForkJoinPool 的工作窃取(Work-Stealing)算法在并行流与并行任务中的性能特征

A 任务拆分粒度 ✓ 正确答案
B 内存
C 线程数
D
#

64. ForkJoinTask 的 fork/join 与 RecursiveTask/RecursiveAction

A RecursiveAction
B
C RecursiveTask ✓ 正确答案
D Runnable
#

65. ForkJoinTask 的 quietlyComplete/quietlyJoin

A 相同
B 更快
C
D quietlyJoin 不检查结果/异常 ✓ 正确答案
#

66. 线程池中任务重试的编排,RetryTemplate 与池内线程的配合,重试次数与超时的总预算如何控制

A 加速
B
C 无限重试
D 重试次数 × 单次超时,超限放弃 ✓ 正确答案
#

67. 线程池任务的执行阶段划分(排队/执行/完成)如何埋点,阶段耗时对容量规划的意义

A 线程不足或队列堆积 ✓ 正确答案
B 内存
C 任务慢
D
#

68. 线程池任务执行完后的资源清理,ThreadLocal.remove、连接归还与事务边界由谁保证

A
B 任务内 remove 或包装器 finally ✓ 正确答案
C 框架
D GC
#

69. 线程池任务执行中的 ThreadMXBean 采样如何定位阻塞点,线程 dump 与池状态的关联分析

A 线程不足
B
C 内存
D 任务阻塞在资源(锁/IO) ✓ 正确答案
#

70. 线程池任务提交速率与消费能力的匹配,背压信号(队列水位、拒绝计数)如何反馈给生产者

A 忽略
B 加速
C 降速/暂停提交 ✓ 正确答案
D
#

71. 线程池与 CompletableFuture 默认池混用时的资源竞争,为何建议显式指定 Executor

A 更快
B 自动隔离
C 拖累所有使用 commonPool 的任务 ✓ 正确答案
D
#

72. 线程池任务的优雅停机,应用收到 SIGTERM 后如何先停止接收任务再排空队列

A shutdown() 停止接收新任务 ✓ 正确答案
B shutdownNow
C
D 中断
#

73. 线程池任务执行异常时的指标与日志关联,错误率、重试次数与线程池状态如何统一观测

A
B 错误率、重试次数、线程池状态 ✓ 正确答案
C 仅日志
D 仅错误率
#

74. 线程池任务顺序性与性能的平衡,单线程 Executor 保序与多线程并发的切换阈值

A 并行
B 多线程
C 单线程 Executor ✓ 正确答案
D
#

75. 线程池任务的优先级与超时组合,延迟队列实现定时任务的精度与线程数关系

A 更快
B 队列空
C 线程数不足,到期任务排队 ✓ 正确答案
D
#

76. 线程池在虚拟线程与平台线程混部时的线程数规划,IO 密集任务迁移后剩余 CPU 密集任务的池化策略

A 虚拟线程
B
C 平台线程池(核数) ✓ 正确答案
D 任意
#

77. LinkedTransferQueue 的 transfer 与 tryTransfer

A 入队
B
C 拒绝
D 阻塞直到消费者出现 ✓ 正确答案
#

78. ManagedBlocker 与 ForkJoinPool 阻塞协作

A 取消
B 阻塞时让 FJP 补线程,防饥饿 ✓ 正确答案
C 加速
D
#

79. RecursiveTask 的合并阈值(threshold)调优

A 拆分过多,调度/窃取开销大 ✓ 正确答案
B 更快
C 并行度低
D
#

80. ScheduledExecutorService.scheduleAtFixedRate 与 scheduleWithFixedDelay

A scheduleWithFixedDelay ✓ 正确答案
B scheduleAtFixedRate
C
D 任意
#

81. 线程池任务的批量结果收集,invokeAll 与 Stream 并行在异常处理与超时上的差异

A
B invokeAll(timeout) ✓ 正确答案
C 任意
D Stream 并行
#

82. StructuredTaskScope.fork 的资源继承与异常传播

A 静态
B ThreadLocal
C Scoped Values(作用域) ✓ 正确答案
D
#

83. Thread.onSpinWait() 的硬件提示

A 提示处理器自旋,降低功耗 ✓ 正确答案
B
C 阻塞
D 超时
#

84. ThreadPoolExecutor 的四种拒绝策略及适用场景

A AbortPolicy
B DiscardPolicy ✓ 正确答案
C CallerRunsPolicy
D
#

85. ThreadPoolExecutor 的扩展点(beforeExecute/afterExecute)

A 任务内
B beforeExecute/afterExecute 扩展点 ✓ 正确答案
C 静态
D
#

86. 线程池饥饿的典型特征(任务等待时间增长、CPU 利用率低)与排查步骤

A 等待增长 + CPU 利用率低 ✓ 正确答案
B CPU 高
C 队列空
D
#

87. 线程池任务的超时中断与 CompletableFuture.orTimeout 的协作,超时后任务仍在执行如何治理

A
B 阻塞
C 自动停止
D 仍执行,需 cancel/中断协作停止 ✓ 正确答案
#

88. allowCoreThreadTimeOut 在突发流量与空闲回收场景下的吞吐抖动与稳定性权衡

A
B 更快
C 核心线程需重建,首任务延迟抖动 ✓ 正确答案
D 省资源
#

89. orTimeout/completeOnTimeout(JDK 9+)在异步任务超时控制上的工程价值

A
B completeOnTimeout ✓ 正确答案
C 任意
D orTimeout
#

90. shutdown 与 shutdownNow 的差异如何在批处理与交互式服务中分别选择

A 任意
B shutdownNow
C shutdown + awaitTermination ✓ 正确答案
D
#

91. thenAccept/thenRun/thenApply 的消费差异

A thenRun
B
C thenAccept ✓ 正确答案
D thenApply
#

92. thenCompose 与 thenCombine 的执行顺序

A thenCombine ✓ 正确答案
B thenCompose
C
D 任意
#

93. whenComplete vs handle 的差异(异常是否改变结果)

A handle ✓ 正确答案
B
C 任意
D whenComplete
#

94. 任务提交是否会直接进入 maxPoolSize 路径,存在哪些隐藏延迟

A 一定
B 不会,需先队列满 ✓ 正确答案
C
D
#

95. 虚拟线程与平台线程池的共存,IO 密集型任务何时必须用虚拟线程?

A
B 大量并发阻塞 IO ✓ 正确答案
C CPU 密集
D 任意
#

96. 线程池任务在高峰期触发的类加载/初始化对首字节延迟的影响,如何预热关键路径

A
B 预热关键路径(预加载/预编译/预连接) ✓ 正确答案
C 加线程
D 加速
#

97. 线程池的线程数选择在微服务网关场景的实践,与下游连接池容量、超时时间如何联合规划

A 大于连接池容量
B
C 任意
D 匹配下游连接池容量,设超时兜底 ✓ 正确答案
#

98. JDK 25 虚拟线程调度器与平台线程调度器在 I/O 密集场景下的上下文切换开销与吞吐差异

A 轻量卸载(continuation),开销小 ✓ 正确答案
B OS 切换
C 更重
D
#

99. 线程池任务的资源隔离,与信号量/舱壁模式组合时的参数预算如何分配

A 加速
B 共享
C 每个依赖独立隔离,限制对下游并发 ✓ 正确答案
D
#

100. JDK 25 中虚拟线程池与 StructuredTaskScope(JEP 505,5th Preview)的协作与边界

A 互斥
B 相同
C 互补(SScope 编排,虚拟线程执行) ✓ 正确答案
D 无关
#

101. 反应式编程与异步回调的核心差异

A 数据流 + 背压 + 声明式组合 ✓ 正确答案
B 阻塞
C 回调嵌套
D
#

102. 如何通过 JMX/Micrometer 暴露指标并接入告警,使容量问题在事故前被定位

A 重启
B
C 指标暴露 + 阈值告警 + 趋势监控 ✓ 正确答案
D 事后排查
#

103. 对于 ThreadPoolExecutor 的 RejectedExecutionHandler,AbortPolicy 默认抛 RejectedExecutionException 在异步消息消费链中如何避免消费阻塞

A 捕获后进重试/死信队列 ✓ 正确答案
B 阻塞
C 丢弃
D
#

104. 线程池任务执行中的线程切换成本如何度量,上下文切换与任务粒度的关系

A 并行度低
B
C 上下文切换次数多,开销占比大 ✓ 正确答案
D 更快
#

105. 线程池任务的执行顺序保证,FIFO 队列在单线程 worker 下是否天然有序,多线程如何保证提交顺序

A
B 天然按提交顺序执行 ✓ 正确答案
C 随机
D 无序
#

106. JDK 25 中 LinkedTransferQueue 的 transfer 与 put/add 在生产者阻塞语义上的差异

A
B 相同
C transfer 阻塞直到消费者接住,put 不阻塞 ✓ 正确答案
D put 更严格
#

107. 线程池任务执行时间过长(>1s)的识别与拆分策略,长任务与短任务混池的影响

A 更快
B 长任务占线程,短任务被拖慢 ✓ 正确答案
C
D 更省
#

108. 线程池任务在执行期间被中断的响应规范,InterruptedException 的传播与中断状态恢复

A 恢复中断标志并传播 ✓ 正确答案
B 吞掉
C 忽略
D
#

109. 线程池任务的失败重试与消息投递的配合,任务执行失败后如何进入重试队列而非直接丢弃

A 无限重试
B
C 落死信队列处理 ✓ 正确答案
D 丢弃
#

110. 线程池任务与数据库连接池的容量匹配,池内线程等待连接时的行为与超时配置

A 阻塞
B 超时抛异常,避免线程无限等待 ✓ 正确答案
C
D 加速
#

111. 线程池任务的幂等执行,任务重复执行如何通过业务幂等键去重,池内重试的边界

A 无限重试
B 忽略
C
D 幂等键去重 + 仅瞬时错误重试 ✓ 正确答案
#

112. JEP 505 Structured Concurrency(5th Preview,JDK 25)

A
B 回调
C 阻塞
D 作用域管理任务生命周期、异常聚合、级联取消 ✓ 正确答案
#

113. JEP 505 与 JEP 506 Scoped Values 的协作模式

A
B 随作用域传递,自动继承 ✓ 正确答案
C 静态
D 随线程
#

114. 线程池任务执行期间 JVM 线程 dump 的时机选择,采样多次 dump 与一次 dump 的定位差异

A 随机
B 多次采样 dump ✓ 正确答案
C 一次 dump
D
#

115. JEP 525(结构化并发 6th Preview,JDK 26)

A 结构化并发的第 6 次预览 ✓ 正确答案
B 废弃
C 独立新特性
D
#

116. 线程池任务的延迟敏感度分级,不同 SLA 任务共用线程池时的抢占与优先级问题

A
B 随机
C 共享池
D 按 SLA 分级隔离池 ✓ 正确答案
#

117. 线程池在测试中的可控性,如何用固定线程池复现并发时序并断言任务执行顺序

A 多线程池
B 单线程固定线程池 ✓ 正确答案
C 随机
D
#

118. 工作窃取算法在大任务与小任务混合下表现差异如何被压测验证

A 静态
B 混合负载压测,测吞吐与延迟分布 ✓ 正确答案
C
D 单任务