ThreadPoolExecutor 线程池相关介绍

目录

  • 一、介绍
    • 1.1> 为什么要用线程池
    • 1.2> 线程池工作流程
    • 1.3> 线程池的代码用例
  • 二、源码解析——构造函数
    • 2.1> 线程池的构造函数及类的继承关系
    • 2.2> Executors提供的线程池模板
    • 2.3> 拒绝策略的实现
    • 2.4> 任务队列BlockingQueue的实现
    • 2.5> 生命周期

一、介绍

线程池我们在工作中经常会用到。在请求量大时,使用线程池,可以充分利用机器资源,增加请求的处理速度。

1.1> 为什么要用线程池

  1. 使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务;
  2. 可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。

1.2> 线程池工作流程

线程池的工作原理大致分为4步,如下图所示:ThreadPoolExecutor 线程池相关介绍_第1张图片
首先,当有任务要执行的时候,会「计算线程池中存在的线程数量与核心线程数量(corePoolSize)进行比较」,如果小于,则在线程池中创建线程,否则,进行下一步判断。

其次,如果不满足上面的条件,则会将任务添加到「阻塞队列(BlockingQueue)」中。等待线程池中的线程空闲下来后,获取队列中的任务进行执行。

第三,如果队列中也塞满了任务,那么会计算「线程池中存在的线程数量与最大线程数量(maxnumPoolSize)进行比较」,如果小于,则在线程池中创建线程。

最后,如果上面都不满足,则会执行对应的「拒绝策略」。

1.3> 线程池的代码用例

ThreadPoolExecutor 线程池相关介绍_第2张图片
ThreadPoolExecutor 线程池相关介绍_第3张图片

二、源码解析——构造函数

2.1> 线程池的构造函数及类的继承关系

ThreadPoolExecutor 线程池相关介绍_第4张图片
构造函数
ThreadPoolExecutor 线程池相关介绍_第5张图片
「解释」

  • corePoolSize:核心线程数。
  • maximumPoolSize:最大线程数。
  • keepAliveTime:线程池中线程的最大闲置生命周期。
  • unit:针对keepAliveTime的时间单位。
  • workQueue:阻塞队列。
  • threadFactory:创建线程的线程工厂。
  • handler:拒绝策略。

2.2> Executors提供的线程池模板

在Executors中,已经给我们提供了很多种线程池的实现。如下图所示:
ThreadPoolExecutor 线程池相关介绍_第6张图片

2.3> 拒绝策略的实现

线程池中提供了如下拒绝策略:
ThreadPoolExecutor 线程池相关介绍_第7张图片

2.4> 任务队列BlockingQueue的实现

ThreadPoolExecutor 线程池相关介绍_第8张图片

2.5> 生命周期

ThreadPoolExecutor 线程池相关介绍_第9张图片

你可能感兴趣的:(Java并发,java,开发语言,线程池)