面试题答案
一键面试-
AbortPolicy(默认策略):
- 实现逻辑:当线程池饱和时,直接抛出RejectedExecutionException异常,阻止系统正常运行。
- 适用场景:适用于对任务执行成功率要求非常高,不允许任务丢失的场景。例如,在金融交易系统中,每一笔交易都至关重要,不允许因为线程池饱和而丢弃交易任务,一旦出现饱和情况,抛出异常可以及时提醒开发人员处理。
-
CallerRunsPolicy:
- 实现逻辑:当线程池饱和时,将被拒绝的任务交由调用execute方法的线程来执行。这样做的目的是为了减轻线程池的压力,因为调用线程通常是主线程或者其他非线程池线程,它在执行任务时会阻塞自己,从而减少新任务的提交速度。
- 适用场景:适用于对响应时间要求不是特别高,但要求所有任务最终都能被执行的场景。比如,在一个日志记录系统中,虽然对记录日志的响应时间没有严格要求,但每条日志都需要被记录,此时使用CallerRunsPolicy可以保证日志不会丢失。
-
DiscardPolicy:
- 实现逻辑:当线程池饱和时,直接丢弃被拒绝的任务,不做任何处理。
- 适用场景:适用于对任务执行结果不敏感,且任务量较大、允许部分任务丢失的场景。例如,在一些实时数据统计系统中,每秒可能会有大量的数据涌入进行统计,但对于一些短暂的、非关键的数据统计任务,如果线程池饱和,丢弃部分任务对整体统计结果影响不大。
-
DiscardOldestPolicy:
- 实现逻辑:当线程池饱和时,丢弃任务队列中最老的一个任务(即最先进入队列的任务),然后尝试将新任务加入队列。
- 适用场景:适用于对任务时效性要求较高的场景。例如,在一个实时路况信息更新系统中,新的路况信息不断产生,更关注最新的路况,此时丢弃最老的路况信息任务,优先处理新的路况信息任务,可以保证系统展示的是较新的路况。