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