Executor框架

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方法里完成定时或延迟执行逻辑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值