面试题答案
一键面试AbortPolicy
- 影响:当线程池饱和时,该策略会抛出
RejectedExecutionException
异常,阻止新任务的提交。这可能导致调用者需要额外处理异常,否则系统可能因未捕获异常而崩溃。 - 适用场景:适用于任务执行非常重要,不允许被丢弃的场景。例如银行转账操作,若因线程池饱和而丢弃任务,可能导致资金损失,所以必须通过异常提醒开发者处理任务无法执行的情况。
CallerRunsPolicy
- 影响:当线程池饱和时,新提交的任务将由提交任务的线程(调用者线程)来执行。这会降低调用者线程的处理速度,因为它需要承担额外的任务执行工作。但好处是不会丢弃任务,也不会抛出异常。
- 适用场景:适用于对响应时间要求不是特别高,但希望所有任务都能得到执行的场景。例如一些日志记录任务,即使执行速度稍有延迟,也不会影响系统核心功能,并且确保日志信息不会丢失。
DiscardPolicy
- 影响:当线程池饱和时,该策略会直接丢弃新提交的任务,不做任何处理。这可能导致部分任务永远得不到执行,但不会抛出异常,也不会影响调用者线程。
- 适用场景:适用于对任务执行结果不太敏感,任务可以被安全丢弃的场景。例如一些实时监控系统中,可能会有大量的心跳检测任务,若线程池饱和,丢弃部分心跳任务对整体监控功能影响不大。
DiscardOldestPolicy
- 影响:当线程池饱和时,该策略会丢弃队列中等待时间最长的任务(队首任务),然后尝试将新任务加入队列。如果再次饱和,则重复此过程。这可能导致一些等待时间长的任务永远得不到执行,但不会抛出异常,也不会影响调用者线程。
- 适用场景:适用于任务具有时效性,新任务比旧任务更重要的场景。例如在股票交易系统中,实时的交易指令比旧的交易指令更有价值,当线程池饱和时,丢弃旧的指令,优先处理新的指令。