(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 是最好的策略
java.util.concurrent.RejectedExecutionException (触发条件:线程数=maximumPoolSize 且 queue已满),后果:线程池终止 --非常严重,证明需要流量控制了,或者资源容量需要扩容了
(2)DiscardPolicy :策略会悄悄抛弃新提交的任务 (触发条件:线程数=maximumPoolSize 且 queue已满),后果:丢弃新任务数据
(3)DiscardOldestPolicy :抛弃旧的线程 (触发条件:线程数=maximumPoolSize 且 queue已满),后果:丢弃旧任务数据
(4)CallerRunsPolicy :即不用线程池中的线程执行,而是交给调用方来执行 (触发条件:线程数=maximumPoolSize 且 queue已满),后果:超出容量评估的流量会交给调用方慢慢的执行
我个人喜好用CallerRunsPolicy ,至少能保证系统基本可用(但是可能会拖垮CPU和JVM, CPU一般都有预警,所以高峰期的核心目标还是控制流量),当然如果你的流量数据是允许丢失的,用DiscardOldestPolicy ,DiscardPolicy 是最好的策略