一、Executor框架的基本组成
ForkJoinPool主要是把我们的任务细分成多个小任务,根据CPU多核处理能力,把任务分配到多个核心上处理,最后再合并返回。
ScheduledThreadPoolExecutor主要是对上面的线程池做了增强,加了调度的逻辑。
建议使用Executors创建线程池,里面的方法封装了上面几个线程池。
ThreadPoolExecutor
线程池的创建参数详解
corePoolSize - 线程池核心池的大小,
maximumPoolSIze - 线程池的最大线程数,临时扩充的线程数不会超过它
keepAliveTime - 当线程数大于核心时,此为终止前多余的空闲线程等待任务的最长时间
unit - keepAliveTime的时间单位,一般为毫秒或者秒
workQueue - 用来储存等待执行任务的队列,设置任务缓存的队列,大小根据具体需要来,任务在线程已经处理不过来了,就会放到任务缓存队列里面,等线程把手里的任务处理完,会去缓存队列里面看还有没有等待处理任务,如果核心空闲了就会把任务取出来处理
threadFactory - 线程工厂,提供对线程的创建和管理等
RejectedExecutionHandler - 饱和策略,所有线程数已经满了,任务缓存队列也满了,这时候已经没有办法去接受新的任务了,这时候就需要自定义一个饱和策略来处理。
线程池大小选择策略
线程池工作流程
当线程数量没有超过corePoolSize时,先创建线程知道达到corePoolSize,核心线程数已经满了时,新提交的任务就不会创建新的线程,会放入任务缓存队列中,当任务缓存队列(工作队列)也满了之后,这时就会继续创建新的线程用来处理任务,一直达到maxumumPoolSize,线程池总共可以处理15个任务。
当任务中的任务达到20个
工作线程,缓存队列都满了,新添加的任务就会被拒绝,拒绝处理的机制就是饱和策略,没有自定义会抛出任务已满的异常。