线程池拒绝策略分析

(1)AbortPolicy:

java.util.concurrent.RejectedExecutionException (触发条件:线程数=maximumPoolSize 且 queue已满),后果:线程池终止  --非常严重,证明需要流量控制了,或者资源容量需要扩容了


(2)DiscardPolicy :策略会悄悄抛弃新提交的任务 (触发条件:线程数=maximumPoolSize 且 queue已满),后果:丢弃新任务数据


(3)DiscardOldestPolicy :抛弃旧的线程  (触发条件:线程数=maximumPoolSize 且 queue已满),后果:丢弃旧任务数据

(4)CallerRunsPolicy :即不用线程池中的线程执行,而是交给调用方来执行 (触发条件:线程数=maximumPoolSize 且 queue已满),后果:超出容量评估的流量会交给调用方慢慢的执行

我个人喜好用CallerRunsPolicy ,至少能保证系统基本可用(但是可能会拖垮CPU和JVM, CPU一般都有预警,所以高峰期的核心目标还是控制流量),当然如果你的流量数据是允许丢失的,用DiscardOldestPolicy ,DiscardPolicy 是最好的策略

猜你喜欢

转载自ahua186186.iteye.com/blog/2407252