实现简单线程池 实现基本的线程池
实现基本的线程池
前提:我们要实现的线程池有如下功能:
- 基本的线程池模型
- 能提交和运行任务
- 能正常关闭线程池
- 线程的拒绝策略
- 线程池扩容
- 缩容线程池
代码地址:
1、线程池的介绍?
线程池是什么?
线程池是一种利用池化技术来管理线程的一种技术。
当没有线程池的时候,我们如何创建线程?
- 继承Thread
- 实现Runnable接口
- 使用Callable和Future来创建线程
当我们自己创建线程时,使用线程的步骤是什么?之间有什么问题?
使用线程的步骤:
- 创建线程
- 启动线程
- 执行业务
- 关闭线程
在上述的四步中,我们发现如下几个问题:
- 其实只有第三步是我们关键的步骤,其他三步都是为了使用线程本身去执行,使用线程繁琐。
- 每次使用完线程后都需要关闭线程,而开辟线程本身是很耗费资源的,此时就会造成资源浪费。
而线程池的作用就是简化线程的使用,优化资源的利用。下面就开始实现线程池
2、实现线程池
在实现线程池的过程中,我们分几个步骤来实现,先实现线程池的最基本的功能,再一步一步去完善其功能。
2.1、线程池雏形
本章节实现线程池的基本雏形。那么线程池的雏形包括了:
- 定义一个队列用于存储当前待执行的任务
- 定义一个集合用于放置执行任务的多个线程
- 提供一个方法供用户提交任务
- 自定义一个线程用于执行用户提交的任务
- 提供工厂供用户获取线程池
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
热门相关:盛世妖颜 网游三国之城市攻略 精灵掌门人 慕少,你老婆又重生了 楚氏赘婿