在Java的中,当核心线程池已满、任务队列已满,且最大线程池也已满时,如果还有新任务提交进来,线程池就会触发拒绝策略(RejectedExecutionHandler)。 JDK原生提供了4种标准的拒绝策略,同时在实际开发中,我们也经常需要自定义拒绝策略。以下是它们的原理及适用的业务场景: --- 1. AbortPolicy(默认策略:中止策略) 处理机制:直接抛出 异常,阻止系统正常运行。 优点:Fail-fast(快速失败),能立刻感知到系统负载达到极限,不会默默丢弃数据。 缺点:如果业务代码没有捕获该异常,可能会导致整个调用链路中断。 适用场景:不允许丢失任务的强一致性/核心业务场景。 举例:订单支付处理、核心资金转账。当系统处理不过来时,直接报错给调用方(或前端页面提示“系统繁忙”),而不是让任务下落不明。调用方捕获异常后可以进行重试或降级处理。 2. CallerRunsPolicy(调用者运行策略) 处理机制:不抛出异常,也不丢弃任务,而是将任务退回给提交任务的线程(通常是主线程或Web容器的Worker线程)去直接同步执行。 优点:提供了一种天然的背压(Backp...