知识卡片

拒绝策略决定过载去向

普通读书笔记卡 · 1503.a

内容

[[线程池要有边界]] 讲”要不要设边界”,这张卡讲突破边界后怎么办:队列满且线程已达上限,或线程池已关闭,新任务被拒绝,交给 RejectedExecutionHandler。JUC 内置四策略:默认抛异常、静默丢弃、丢最老任务、调用者自己执行(天然降速),也可自定义。选错会让过载变静默丢数据。

参考来源

- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第1章《多线程原理与实战》1.6.9节《线程池的拒绝策略》(源文件:_epub-src/OEBPS/Text/chapter40.xhtml) - 结论依据:原文说明任务被拒绝的两种情况(线程池已关闭;工作队列已满且maximumPoolSize已满),并列出JUC提供的AbortPolicy、DiscardPolicy、DiscardOldestPolicy、CallerRunsPolicy及自定义策略五种实现,指出"无论以上哪种情况任务被拒绝,线程池都会调用RejectedExecutionHandler实例的rejectedExecution方法",因此推出本卡结论。 - 原始内容:无论以上哪种情况任务被拒绝,线程池都会调用RejectedExecutionHandler实例的rejectedExecution方法。RejectedExecutionHandler是拒绝策略的接口,JUC为该接口提供了以下几种实现:·AbortPolicy:拒绝策略。·DiscardPolicy:抛弃策略。·DiscardOldestPolicy:抛弃最老任务策略。·CallerRunsPolicy:调用者执行策略。·自定义策略。