面试题答案
一键面试- 线程池配置参数方面
- 设置合理的核心线程数与最大线程数:根据任务类型和系统资源,确定合适的核心线程数
corePoolSize
和最大线程数maximumPoolSize
。对于I/O密集型任务,核心线程数可设置为CPU核心数的2倍左右;对于CPU密集型任务,核心线程数可与CPU核心数相近。避免线程数过多导致上下文切换开销过大以及资源竞争。例如,若系统有8个CPU核心,对于CPU密集型任务,核心线程数可设为8,最大线程数也不宜过大,防止过多线程争抢CPU资源。 - 设置合适的队列容量:使用有界队列(如
ArrayBlockingQueue
),设置合理的队列容量capacity
。若队列容量过小,任务可能很快被提交到线程池创建新线程,增加线程创建开销和资源竞争;若队列容量过大,大量任务在队列中堆积,可能导致任务处理延迟。例如,根据预估的任务流量,设置队列容量为100,当任务数超过队列容量且线程数未达到最大线程数时,才创建新线程处理任务。 - 设置合理的存活时间:设置线程存活时间
keepAliveTime
,当线程数超过核心线程数时,多余的空闲线程在存活时间后会被销毁。合理设置存活时间,可避免过多空闲线程占用资源,减少资源竞争。例如,设置存活时间为1分钟,若1分钟内线程一直空闲且线程数大于核心线程数,该线程会被销毁。
- 设置合理的核心线程数与最大线程数:根据任务类型和系统资源,确定合适的核心线程数
- 任务分配方面
- 使用不同的线程池:根据任务的类型、优先级等将任务分配到不同的线程池。例如,将高优先级任务、I/O密集型任务、CPU密集型任务分别提交到不同的线程池处理。这样可以避免不同类型任务相互干扰,减少资源竞争。比如创建一个高优先级任务线程池,核心线程数为4,最大线程数为8,专门处理高优先级任务;再创建一个I/O密集型任务线程池,核心线程数为16,最大线程数为32。
- 任务优先级调度:对任务设置优先级,在线程池执行任务时,按照优先级顺序处理任务。例如,使用
PriorityBlockingQueue
作为线程池的任务队列,任务实现Comparable
接口,根据优先级进行排序。线程池从队列中获取任务时,优先获取高优先级任务,确保高优先级任务优先执行,减少与低优先级任务的资源竞争。 - 任务隔离:将相互独立、无依赖关系的任务分开处理,避免任务之间因共享资源而产生竞争。例如,在一个电商系统中,将订单处理任务和商品推荐任务分别提交到不同的线程池,因为这两个任务通常没有直接的数据交互和资源共享,可有效减少线程资源竞争。