面试题答案
一键面试任务提交时线程池已关闭
- 异常场景:当向已经调用
shutdown
或shutdownNow
方法关闭的线程池提交任务时,会抛出RejectedExecutionException
。 - 恢复措施:在提交任务前,通过
isShutdown
方法检查线程池状态,如果已关闭,可以选择重新创建一个新的线程池来提交任务,或者根据业务逻辑处理任务,例如将任务放入队列等待新线程池创建后处理。
任务执行过程中抛出未捕获异常
- 异常场景:如果线程池中的任务在执行过程中抛出未捕获的异常,默认情况下线程池不会对其进行处理,线程会终止。若线程池使用默认的拒绝策略,当线程池和任务队列都满时,新提交的任务也会被拒绝并抛出
RejectedExecutionException
。 - 恢复措施:对于任务执行中的异常,可以通过实现
Thread.UncaughtExceptionHandler
接口来捕获并处理异常,在处理逻辑中可以记录异常信息,根据业务需求决定是否重新提交任务等操作。对于RejectedExecutionException
,可以调整线程池参数,如增加核心线程数、最大线程数或任务队列容量,或者自定义拒绝策略,如将被拒绝的任务存储到外部队列稍后处理。
线程资源耗尽
- 异常场景:当线程池的任务队列已满,并且达到最大线程数,新的任务无法被处理,持续提交任务会导致资源耗尽,可能引发
OutOfMemoryError
等错误。 - 恢复措施:优化任务处理逻辑,减少任务执行时间,提高线程池的处理效率。合理调整线程池参数,根据系统资源(如 CPU、内存等)和任务负载情况,适当增加核心线程数、最大线程数以及任务队列容量。也可以考虑使用资源隔离技术,限制每个任务或任务类型使用的资源量,避免单个任务耗尽所有资源。