一、线程池的7个核心参数说明:
1.corePoolSize:核心线程数
2.maximumPoolSize:最大线程数
3.keepAliveTime:最大空闲时间
4.unit:最大空闲时间单位
5.workQueue:任务队列
6.threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程一般用默认的即可。
4.handler:拒绝策略,有以下四种:
(1)ThreadPoolExecutor.AbortPolicy 丢弃任务,并抛出 RejectedExecutionException 异常。
(2)ThreadPoolExecutor.CallerRunsPolicy:该任务被线程池拒绝,由调用 execute方法的线程执行该任务。
(3)ThreadPoolExecutor.DiscardOldestPolicy : 抛弃队列最前面的任务,然后重新尝试执行任务。
(4)ThreadPoolExecutor.DiscardPolicy,丢弃任务,不过也不抛出异常。
也可以自己实现RejectedExecutionHandler接口来自定义拒绝策略
线程池的4种拒绝策略理论简介
等待队列也已经排满了,再也塞不下新任务了同时,线程池中的max线程也达到了,无法继续为新任务服务。
这时候我们就需要拒绝策略机制合理的处理这个问题。
JDK拒绝策略:
● AbortPolicy(默认):直接抛出 RejectedExecutionException异常阻止系统正常运知。
● CallerRunsPolicy:"调用者运行"一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量。
● DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入队列中尝试再次提交当前任务。
● DiscardPolicy:直接丢弃任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的一种方案。
以上内置拒绝策略均实现了RejectedExecutionHandler接口。