面试题答案
一键面试- 资源耗尽风险
- 固定线程池大小不合理:使用
Executors.newFixedThreadPool(int nThreads)
创建固定大小线程池时,如果nThreads
设置过小,在任务量较大时,会导致任务长时间排队等待执行,系统吞吐量降低;若设置过大,可能会耗尽系统资源(如内存),因为每个线程都需要占用一定的内存空间用于栈等数据结构。 - 缓存线程池无限制增长:
Executors.newCachedThreadPool()
创建的缓存线程池,线程数会根据任务数量动态增长,若任务持续大量提交,线程数量可能无限制增加,最终耗尽系统资源,导致系统崩溃。
- 固定线程池大小不合理:使用
- OOM(Out Of Memory)风险
- 任务队列过大:对于
Executors.newFixedThreadPool(int nThreads)
和Executors.newSingleThreadExecutor()
,它们使用的是无界队列LinkedBlockingQueue
。当任务提交速度远大于线程处理速度时,任务会不断在队列中堆积,导致内存占用不断增加,最终可能引发OOM异常。
- 任务队列过大:对于
- 性能问题
- 线程上下文切换开销:在
Executors.newCachedThreadPool()
场景下,若短时间内有大量短期任务提交,线程频繁创建和销毁,会导致严重的线程上下文切换开销。线程上下文切换需要保存和恢复寄存器、内存映射等信息,这会消耗CPU资源,降低系统整体性能。 - 队列等待延迟:如使用
Executors.newFixedThreadPool(int nThreads)
时,若任务处理时间较长,后续任务在队列中等待时间过长,会导致整体响应时间变长,影响系统性能和用户体验。
- 线程上下文切换开销:在