请说明Java线程池中常见的任务拒绝策略有哪些,并解释各自的适用场景和触发条件。
考察说明
考查对Java线程池饱和处理机制的理解,包括各拒绝策略的行为差异和适用场景。
回答思路
- 【回答框架 1】Java线程池在任务队列已满且线程数达到最大值时,会触发拒绝策略。常见的四种策略包括AbortPolicy、CallerRunsPolicy、DiscardPolicy和DiscardOldestPolicy。
- 【回答框架 2】AbortPolicy是默认策略,直接抛出RejectedExecutionException,适合要求严格失败通知的场景。CallerRunsPolicy由调用线程执行任务,提供简单限流,但可能阻塞提交线程。
- 【回答框架 3】DiscardPolicy静默丢弃任务,DiscardOldestPolicy丢弃队列中最旧的任务后重新提交,适合允许丢弃部分任务的场景。
- 【回答框架 4】除内置策略外,可实现RejectedExecutionHandler自定义逻辑,结合业务需求处理积压任务。
- 【关键点 1】AbortPolicy为默认策略,抛出RejectedExecutionException。
- 【关键点 2】CallerRunsPolicy在调用者线程执行任务,可减缓提交速度。
- 【关键点 3】DiscardPolicy和DiscardOldestPolicy会静默丢弃任务,使用时需评估数据损失风险。
- 【易错点 1】误以为DiscardOldestPolicy总是丢弃最旧任务,实际丢弃的是队列头部任务,若队列为优先级队列则行为不同。
- 【易错点 2】CallerRunsPolicy若在同步提交场景使用,可能导致调用线程长时间阻塞。
- 【易错点 3】自定义拒绝策略时未考虑线程安全或异常处理,可能引发未捕获异常。