1、Executor:接口,执行器,将任务的提交和执行解耦
2、ExecutorService:Executor的子类接口,其提供了生命周期管理的方法,以及可跟踪一个或多个异步任务执行状况返回Future的方法
3、AbstractExecutorService:抽象类,ExecutorService执行方法的默认实现,但未实现Executor的execute方法
4、ThreadPoolExecutor:Executor框架最核心的类,继承AbstractExecutorService,实现了Executor的execute方法
* execute的实现:
- 1、当线程数量少于核心线程数量时,新增核心线程(addWork())处理任务
- 2、当线程数量大于等于核心线程数,将任务放入队列
- 3、队列放满后,新增非核心线程(addWork())处理任务
- 4、当线程数量大于线程总数时,执行拒绝策略
* addWorker(Runnable firstTask, boolean core)的实现:
- 1、core决定增加核心线程或者非核心线程
- 2、new Worker(firstTask),包含一个任务firstTask和一个线程,线程加入线程池并调用start()方法使线程就绪,firstTask作为该线程的第一个任务
* runWorker(Worker w)的实现:
- 1、执行firstTask,完成后置为null
- 2、firstTask==null,循环从getTask()从队列里获取任务并执行
5、ThreadPoolExecutor构造参数
* corePoolSize:核心线程的个数,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务
* maximumPoolSize:线程池最大线程数,限定为2^29-1。
* keepAliveTime:表示线程没有任务执行时最多保持多久时间会回收。默认只对非核心线程起作用,当调用allowCoreThreadTimeOut(true),对核心线程也起作用
* unit:unit是参数keepAliveTime的时间单位,在TimeUnit类中有7种静态属性。
* workQueue: 一个阻塞队列,用来存储等待执行的任务,这个参数的选择也很重要,会对线程池的运行过程产生重大影响,一般情况下,有几种选择
* ArrayBlockingQueue; //有界队列,基于数组的先进先出队列,此队列创建时必须指定大小;
* PriorityBlockingQueue; //一个无界的阻塞队列
* LinkedBlockingQueue; //有界队列,无参可视为无界队列,基于链表的先进先出队列,如果创建时没有指定此队列大小,则默认为Integer.MAX_VALUE;
* SynchronousQueue; //同步移交队列,这个队列比较特殊,它不会保存提交的任务,而是将直接新建一个线程来执行新来的任务
* 名义上是个队列,但底层并不维护链表也没有维护数组,在一个线程调用它的put方法时会立即将塞入的元素转交给调用take的线程,如果没有调用take的线程则put方法会阻塞
* threadFactory:线程工厂,主要用来创建线程。
* handler:表示当拒绝处理任务时的策略,当线程池的任务缓存队列已满并且线程池中的线程数目达到maximumPoolSize,如果还有任务到来就会采取任务拒绝策略,通常有以下四种策略
* ThreadPoolExecutor.AbortPolicy;//丢弃任务并抛出RejectedExecutionException异常。
* ThreadPoolExecutor.DiscardPolicy;//也是丢弃任务,但是不抛出异常。
* ThreadPoolExecutor.DiscardOldestPolicy;//丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
* ThreadPoolExecutor.CallerRunsPolicy;//由调用线程处理该任务
6、多线程创建的工厂类Executors
* newFixedThreadPool(int nThreads) (无界队列,允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。)
* newCachedThreadPool() (同步移交队列,允许创建的线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM)
* newSingleThreadExecutor() (无界队列,允许的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。)
* newScheduledThreadPool(int corePoolSize) (优先级队列, 允许创建的线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。)
7、线程池的执行逻辑:先执行Worker里的run方法,循环从队列获取任务,再执行获取到的任务的run方法,定时或延迟线程池则是将任务本身包装成RunnableScheduledFuture任务,任务的run方法里完成定时或延迟执行逻辑