Hello ThreadPoolExecutor

ThreadPoolExecutor创建:
public ThreadPoolExecutor(int corePoolSize,
                          int maximumPoolSize,
                          long keepAliveTime,
                          TimeUnit unit,
                          BlockingQueue<Runnable> workQueue,
                          ThreadFactory threadFactory,
                          RejectedExecutionHandler handler)
构造函数如下:

参数说明:

  1. corePoolSize:核心线程池大小, 当新的任务到线程池后,线程池会创建新的线程(即使有空闲线程),直到核心线程池已满。
  2. maximumPoolSize:最大线程池大小,顾名思义,线程池能创建的线程的最大数目
  3. keepAliveTime:程池的工作线程空闲后,保持存活的时间
  4. TimeUnit: 时间单位BlockingQueue<Runnable>:用来储存等待执行任务的队列
  5. threadFactory:线程工厂
  6. RejectedExecutionHandler: 当队列和线程池都满了时拒绝任务的策略
重要参数说明:

corePoolSize 和 maximumPoolSize

  1. 默认情况下线程中的线程初始时为 0, 当有新的任务到来时才会创建新线程,当线程数目到达 corePoolSize 的数量时,新的任务会被缓存到 workQueue 队列中。
  2. 如果不断有新的任务到来,队列也满了的话,线程池会再新建线程直到总的线程数目达到 maximumPoolSize。
  3. 如果还有新的任务到来,则要根据 handler 对新的任务进行相应拒绝处理.

BlockingQueue<Runnable>

  1. 一个阻塞队列,用来存储等待执行的任务
  2. 常用队列:
    1. ArrayBlockingQueue
      1. 基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序
    2. LinkedBlockingQueue
      1. 一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue.
      2. 静态工厂方法Executors.newFixedThreadPool()使用了这个队列
    3. SynchronousQueue
      1. 不存储元素的阻塞队列
      2. 每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态
      3. 吞吐量通常要高于LinkedBlockingQueue
      4. 注: 静态工厂方法Executors.newCachedThreadPool使用了这个队列
    4. PriorityBlockingQueue
      1. 具有优先级得无限阻塞队列
  3. RejectedExecutionHandler
    1. 线程池处于饱和状态时需要采取的应对策略
    2. dk提供策略:
      1. AbortPolicy:表示无法处理新任务时抛出异常, 默认策略
      2. CallerRunsPolicy:用调用者所在线程来运行任务
      3. DiscardOldestPolicy:该策略将丢弃最老的一个请求,也就是即将被执行的任务,并尝试再次提交当前任务
      4. DiscardPolicy:不处理,丢弃掉
      5. 自定义策略:
        1. 实现 RejectedExecutionHandler 接口

猜你喜欢

转载自www.cnblogs.com/sunshinekevin/p/10259707.html