一、ThreadPoolExecutor基本概述

ThreadPoolExecutor是线程池类,对于线程池,可以将它理解为“存放一定数量线程的一个线程集合。线程池允许若干个线程同时运行,运行同时运行的线程数量就是线程池的容量;当添加到线程池中的线程超过它的容量时,会有一部分线程阻塞等待。线程池会通过相应的调整策略和拒绝策略,对添加到线程池中的线程进行管理。”

二、ThreadPoolExecutor基本数据结构

java 线程池工具栏 java 线程池 worker_java 线程池工具栏


从上图中明显得出ThreadPoolExecutor包含以下几点:

(1)workers

workers是HashSet类型,即它是一个Worker集合,而每一个worker就对应一个线程,也就是说线程池通过workers包含了一个线程集合。当worker对应的线程池启动时,它会执行线程池中的任务;当执行完一个任务后,它会从线程池的阻塞队列中取出一个阻塞的任务来继续运行。

worker的作用就是线程池通过它实现了允许多个线程同时运行。

(2)workQueue

workQueue是==BlockingQueue==类型,即它是一个阻塞队列。当线程池中的线程数超过它的容量的时候,线程会进入阻塞队列进行阻塞等待。使线程池实现了阻塞功能。

(3)mainLock

mainLock是互斥锁,即ReentrentLock,实现了对线程池的互斥访问。

(4)corePoolSize和maximumPoolSize

corePoolSize是”核心池大小”,maximumPoolSize是”最大池大小”。它们的作用是调整”线程池中实际运行的线程的数量”。

例如,当新任务提交给线程池时(通过execute方法)。

– 如果此时,线程池中运行的线程数量< corePoolSize,则创建新线程来处理请求。

– 如果此时,线程池中运行的线程数量> corePoolSize,但是却< maximumPoolSize;则仅当阻塞队列满时才创建新线程。

如果设置的 corePoolSize 和 maximumPoolSize 相同,则创建了固定大小的线程池。如果将 maximumPoolSize 设置为基本的无界值(如 Integer.MAX_VALUE),则允许池适应任意数量的并发任务。在大多数情况下,核心池大小和最大池大小的值是在创建线程池设置的;但是,也可以使用 setCorePoolSize(int) 和 setMaximumPoolSize(int) 进行动态更改。

(5)poolSize

poolSize是指当前线程池的实际大小,即线程池中任务的数量

(6) allowCoreThreadTimeOut和keepAliveTime

allowCoreThreadTimeOut表示是否允许”线程在空闲状态时,仍然能够存活”;而keepAliveTime是当线程池处于空闲状态的时候,超过keepAliveTime时间之后,空闲的线程会被终止。

(7)threadFactory

threadFactory是ThreadFactory对象,它是一个线程工厂类,“线程池通过ThreadFactory创建线程”。

(8)handler

handler是RejectedExecutionHander类型。它是线程拒绝的句柄,当某任务添加到线程池中,而线程池拒绝该任务时,线程池会通过handler进行相应的处理。

由此得到:线程池通过workers来管理“线程集合”,每个线程在启动后,会执行线程中的任务;当一个任务执行完后,它会从线程池的阻塞队列中去取出任务来继续运行。阻塞队列(BlockingQueue)是管理线程池任务的队列,当添加到线程池中的任务超过线程池的容量时,该任务就会进入阻塞队列进行等待。

三、ThreadPoolExecute主要API

// 阻塞队列。
private final BlockingQueue<Runnable> workQueue;
// 互斥锁
private final ReentrantLock mainLock = new ReentrantLock();
// 线程集合。一个Worker对应一个线程。
private final HashSet<Worker> workers = new HashSet<Worker>();
// “终止条件”,与“mainLock”绑定。
private final Condition termination = mainLock.newCondition();
// 线程池中线程数量曾经达到过的最大值。
private int largestPoolSize;
// 已完成任务数量
private long completedTaskCount;
// ThreadFactory对象,用于创建线程。
private volatile ThreadFactory threadFactory;
// 拒绝策略的处理句柄。
private volatile RejectedExecutionHandler handler;
// 保持线程存活时间。
private volatile long keepAliveTime;

private volatile boolean allowCoreThreadTimeOut;
// 核心池大小
private volatile int corePoolSize;
// 最大池大小
private volatile int maximumPoolSize;

文章只是作为自己的学习笔记,借鉴了网上的许多案例,如果觉得阔以的话,希望多交流,在此谢过…