MST

星途 面试题库

面试题:Java中线程池任务放入阻塞队列时,若队列已满会发生什么

在Java线程池的机制里,当任务尝试放入阻塞队列,而此时队列已满,会依据线程池的哪些策略来处理后续操作?请简述这些策略及其应用场景。
40.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

在Java线程池机制中,当任务尝试放入已满的阻塞队列时,会依据以下策略来处理后续操作:

  1. AbortPolicy(默认策略)
    • 策略描述:直接抛出RejectedExecutionException异常,阻止系统正常运行。
    • 应用场景:适用于非常关键、不允许任务丢失的场景,比如一些金融交易相关的任务处理,如果任务被拒绝,抛出异常能让开发者及时知晓并处理。
  2. CallerRunsPolicy
    • 策略描述:由提交任务的线程来执行该任务,即绕过线程池,在调用execute方法的线程中直接运行任务。
    • 应用场景:适用于任务提交速度远快于线程池处理速度的场景,通过让调用者线程帮忙处理任务,减轻线程池的压力,同时保证任务不会丢失,如在一些简单的测试场景或者对性能要求不是特别高但要求任务必须执行的场景中使用。
  3. DiscardPolicy
    • 策略描述:默默丢弃无法处理的任务,不给予任何提示。
    • 应用场景:适用于那些对任务执行结果不敏感,且任务执行不重要的场景,例如一些日志记录任务,如果因为系统繁忙丢弃几个日志记录任务,对系统整体功能影响不大。
  4. DiscardOldestPolicy
    • 策略描述:丢弃队列中等待最久的任务,然后把当前任务加入队列尝试再次提交。
    • 应用场景:适用于希望优先处理最新提交的任务,且对任务顺序要求不高的场景,比如在一些实时数据处理场景中,更关注最新的数据,丢弃较旧的数据任务影响较小。