面试题答案
一键面试- AbortPolicy
- 场景:当任务队列和线程池都已满,且无法再接受新任务时,若希望立即抛出异常,中断当前任务提交操作,提醒调用者任务提交失败,此时使用该策略。例如在一些对任务执行的完整性和及时性要求极高的系统中,如金融交易系统,每一个交易任务都至关重要,不能丢弃,若无法处理新任务则直接抛出异常,让相关人员及时处理。
- CallerRunsPolicy
- 场景:当线程池饱和时,将被拒绝的任务交由提交任务的线程来执行。适用于对响应时间要求不高,但希望能尽可能处理任务的场景。比如一些后台日志记录任务,主线程提交日志记录任务到线程池,若线程池饱和,主线程就自己执行该日志记录任务,虽然可能会使主线程短暂阻塞,但不会丢失任务,同时也不需要额外复杂的处理。
- DiscardPolicy
- 场景:当系统资源紧张,且对任务的执行不是非常关键,允许丢弃无法处理的新任务时使用。例如在一些实时监控系统中,监控数据可能频繁产生,若线程池已满无法处理新的监控数据任务,丢弃这些任务可能对整体监控功能影响不大,只要保证核心监控指标的处理即可。
- DiscardOldestPolicy
- 场景:当线程池和任务队列都满时,丢弃任务队列中最老的任务(即将最早进入队列但还未执行的任务丢弃),然后尝试提交新任务。适用于任务执行的时效性不强,但需要保证新任务有机会执行的场景。例如在一些数据采集系统中,新采集的数据更有价值,若线程池和队列满了,丢弃旧的数据采集任务,优先处理新的数据采集任务,以保证采集到的数据的及时性。