自定义线程池原理
线程池中分为核心线程和临时线程;首先创建核心线程使用,创建之后一直存在线程池,核心线程被占用并且队列任务已满,才会创建临时线程;临时线程使用超过自定义临时线程最大数时会触发自定义的任务拒绝策略
核心线程:创建之后一直存活在线程池,任务执行完成被线程池回收,可以被重复使用
临时线程:使用完就销毁,需要时线程池重新创建
任务拒绝策略
任务拒绝策略是自定义线程池ThreadPoolExecutor类的内部类
内部类原理:单独存在无意义,依赖于外部类才有意义;任务拒绝策略是在自定义线程池中才会使用,所以才定义在自定义线程池ThreadPoolExecutor类里
自定义线程池相关知识点
自定义线程池相关形参Demo
- new ThreadPoolExecutor.AbortPlicy()
该策略触发条件:执行任务数量(16)超过了最大线程数(最大线程数_maxmumPoolSize+任务队列_capacity)的数量(15)
线程池默认拒绝策略;不超过长度的任务正常执行,丢弃超过(最大线程数+阻塞队列长度)的任务并且抛出异常
最大线程数:核心线程+临时线程;corePoolSize:核心线程数量,maximumPoolSize:最大线程数(核心线程数+临时线程数)
阻塞队列又称任务队列:自定义队列长度capacity
- new ThreadPoolExecutor.DiscardPolicy()
该策略触发条件:执行任务数量(5)超过了最大线程数(最大线程数_maxmumPoolSize+任务队列_capacity)的数量(3)
最大线程数范围内的任务正常执行,超过时丢弃超出的任务并且不抛异常;不推荐使用
- new ThreadPoolExecutor.DiscardOldestPolicy()
该策略触发条件:执行任务数量(10)超过了最大线程数(最大线程数_maxmumPoolSize+任务队列_capacity)的数量(3)
最大线程数范围内的任务正常执行,有超出任务时,会清除任务队列中最先等待的任务,再把当前任务插入任务队列;最后结果是中间的任务会被清除,被后面的任务覆盖执行
- new ThreadPoolExecutor.CallerRunsPolicy()
该策略触发条件:执行任务数量(10)超过了最大线程数(最大线程数_maxmumPoolSize+任务队列_capacity)的数量(3)
最大线程数范围内的任务正常执行,有超出任务时,调用当前线程任务的run方法不使用线程池直接执行