实现简单线程池 实现基本的线程池

实现基本的线程池

前提:我们要实现的线程池有如下功能:

  1. 基本的线程池模型
  2. 能提交和运行任务
  3. 能正常关闭线程池
  4. 线程的拒绝策略
  5. 线程池扩容
  6. 缩容线程池

代码地址:

1、线程池的介绍?

线程池是什么?

线程池是一种利用池化技术来管理线程的一种技术。

当没有线程池的时候,我们如何创建线程?

  1. 继承Thread
  2. 实现Runnable接口
  3. 使用Callable和Future来创建线程

当我们自己创建线程时,使用线程的步骤是什么?之间有什么问题?

使用线程的步骤:

  1. 创建线程
  2. 启动线程
  3. 执行业务
  4. 关闭线程

在上述的四步中,我们发现如下几个问题:

  1. 其实只有第三步是我们关键的步骤,其他三步都是为了使用线程本身去执行,使用线程繁琐。
  2. 每次使用完线程后都需要关闭线程,而开辟线程本身是很耗费资源的,此时就会造成资源浪费。

而线程池的作用就是简化线程的使用,优化资源的利用。下面就开始实现线程池

2、实现线程池

在实现线程池的过程中,我们分几个步骤来实现,先实现线程池的最基本的功能,再一步一步去完善其功能。

2.1、线程池雏形

本章节实现线程池的基本雏形。那么线程池的雏形包括了:

  1. 定义一个队列用于存储当前待执行的任务
  2. 定义一个集合用于放置执行任务的多个线程
  3. 提供一个方法供用户提交任务
  4. 自定义一个线程用于执行用户提交的任务
  5. 提供工厂供用户获取线程池

2.2、线程池的关闭

如果不实现关闭线程池的功能,那么在JVM停止运行时,线程池中的线程仍处于运行状态,这会导致JVM无法停止。

那么在实现关闭线程池功能前,我们先对线程池内的线程设定几个状态:

BLOCK:等待执行任务
RUNNING:正在执行任务中
STOP:线程已经关闭

对线程池本身设定几个状态:

STARED:线程池正常运行中
STOP:线程池已经关闭

然后在不同的情况下对不同的状态进行更改、】校验

2.3、拒绝策略

2.1、为什么存在拒绝策略?

​ 线程池在接收任务的时候,如果某些任务正在执行,而新接收的任务无法立即得到执行时,新接收的任务就需要等待线程去运行。在这个过程中,等待运行的任务如果不加以限制,则会导致等待的任务无法增大。

​ 而在线程池中对等待执行任务(队列)的数量限制策略被称之为拒绝策略。

​ 例如假设我们限定队列最大为100,那么在队列达到100以后,再提交任务时,有的策略规定当前提交任务的操作阻塞等待队列有空位,亦或者直接返回错误。

2.2、如何实现?

​ 我们需要给队列设置一个大小临界值,当到达这个临界值以后,执行相对应的拒绝策略实现即可。

2.4、线程池的扩容和缩容

为什么线程池需要扩容?如何实现

​ 一个线程池是需要能够动态伸缩的,例如初始化时线程池中线程数为5个,那么在任务繁重的时候,为了更快的将任务执行完成,可以临时增加线程,已达到加快任务执行的目的,这个操作被称之为线程池的扩容。

​ 而当繁重的任务处理完后,临时增加出来的线程会一直空闲,如果此时不将其释放,则会浪费多余的线程资源,而将多余的线程资源释放的操作被称之为线程池的缩容。

​ 实现线程池扩/缩容之前,先要定义几个变量:

​ 核心线程数:coreThread,保证线程池中最小常驻线程数

​ 最大线程数:maxThread,线程池中线程最大可以扩容到当前数量

​ 实现逻辑:

​ 1、当队列数量大于核心线程数时即可将线程数扩容至maxThread

​ 2、当队列里面没有任务时,即可将线程数缩容至coreThread

附:完整源码

https://gitee.com/kxsdh/simple-thread-pool

热门相关:盛世妖颜   网游三国之城市攻略   精灵掌门人   慕少,你老婆又重生了   楚氏赘婿