MST

星途 面试题库

面试题:Java线程池执行流程中饱和策略的原理与应用场景

详细说明Java线程池执行流程中四种饱和策略(AbortPolicy、CallerRunsPolicy、DiscardOldestPolicy、DiscardPolicy)各自的原理,并举例说明在哪些实际应用场景中适合使用这些不同的饱和策略?
13.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

AbortPolicy

  • 原理:当线程池饱和时,新任务提交会抛出 RejectedExecutionException 异常,阻止任务被执行。这是线程池默认的饱和策略。
  • 适用场景:适用于需要严格控制任务执行,不允许任务丢失的场景。例如金融交易系统,任何一笔交易任务都至关重要,一旦出现任务无法执行的情况,通过抛出异常可以及时发现并处理问题,避免数据不一致或交易失败未被察觉。

CallerRunsPolicy

  • 原理:当线程池饱和时,新提交的任务不会被丢弃,也不会抛出异常,而是由提交任务的线程(即调用 execute 方法的线程)来执行该任务。这样做的目的是为了降低新任务提交的速度,给线程池中的线程更多时间处理已有的任务。
  • 适用场景:适用于对任务执行实时性要求不高,但希望能尽可能处理所有提交任务的场景。比如一些后台日志记录任务,即使主线程来执行日志记录任务,也不会对系统核心业务产生较大影响,同时能保证日志任务最终被执行。

DiscardOldestPolicy

  • 原理:当线程池饱和时,会丢弃队列中等待时间最长的任务(即队头任务),然后尝试将新提交的任务加入队列。如果此时队列再次饱和,则会再次重复上述过程。
  • 适用场景:适用于处理优先级较高且时效性较强的任务场景。例如在一个实时数据处理系统中,新的数据不断产生,而处理能力有限,对于一些已经等待很久但可能已经过时的数据任务,可以选择丢弃,优先处理新到达的时效性更强的数据任务。

DiscardPolicy

  • 原理:当线程池饱和时,新提交的任务会直接被丢弃,且不会抛出任何异常。任务提交者也不会收到任务被丢弃的通知。
  • 适用场景:适用于能够接受任务丢失且对任务执行没有严格要求的场景。例如在一个高并发的监控系统中,每秒可能会产生大量的监控数据采集任务,但如果系统处理能力有限,对于一些采集到的数据任务即使丢失一部分,也不会对整体监控分析产生严重影响,此时可以采用这种策略。