MST
星途 面试题库

面试题:Java线程池中常见导致异常的场景及如何初步恢复

请列举Java线程池中几个常见的会导致异常的场景,并且针对这些场景,说明一般可以采取哪些初步的恢复措施?
48.6万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

任务提交时线程池已关闭

  • 异常场景:当向已经调用 shutdownshutdownNow 方法关闭的线程池提交任务时,会抛出 RejectedExecutionException
  • 恢复措施:在提交任务前,通过 isShutdown 方法检查线程池状态,如果已关闭,可以选择重新创建一个新的线程池来提交任务,或者根据业务逻辑处理任务,例如将任务放入队列等待新线程池创建后处理。

任务执行过程中抛出未捕获异常

  • 异常场景:如果线程池中的任务在执行过程中抛出未捕获的异常,默认情况下线程池不会对其进行处理,线程会终止。若线程池使用默认的拒绝策略,当线程池和任务队列都满时,新提交的任务也会被拒绝并抛出 RejectedExecutionException
  • 恢复措施:对于任务执行中的异常,可以通过实现 Thread.UncaughtExceptionHandler 接口来捕获并处理异常,在处理逻辑中可以记录异常信息,根据业务需求决定是否重新提交任务等操作。对于 RejectedExecutionException,可以调整线程池参数,如增加核心线程数、最大线程数或任务队列容量,或者自定义拒绝策略,如将被拒绝的任务存储到外部队列稍后处理。

线程资源耗尽

  • 异常场景:当线程池的任务队列已满,并且达到最大线程数,新的任务无法被处理,持续提交任务会导致资源耗尽,可能引发 OutOfMemoryError 等错误。
  • 恢复措施:优化任务处理逻辑,减少任务执行时间,提高线程池的处理效率。合理调整线程池参数,根据系统资源(如 CPU、内存等)和任务负载情况,适当增加核心线程数、最大线程数以及任务队列容量。也可以考虑使用资源隔离技术,限制每个任务或任务类型使用的资源量,避免单个任务耗尽所有资源。