引入
- 在实际使用中,线程是很占用系统资源的,如果对线程管理不善很容易导致系统问题。因此,在大多数并发框架中都会使用线程池来管理线程,使用线程池主要有如下好处:
- 1.使用线程池可以重复利用已有的线程继续执行任务,避免线程在创建和销毁时造成的消耗。
- 2、由于没有线程创建和销毁时的消耗,可以提高系统的响应速度
- 3、通过线程池可以对线程进行合理的管理,根据系统的承受能力调整可运行线程数量的大小。
工作原理
工作原理:
- 线程池执行所提交的任务过程:
- 先判断线程池中核心线程池中所有的线程是否都在执行任务。如果不是,则创建一个线程执行刚提交的任务,否则,核心线程池中所有的线程都在执行任务,则进入第二步。
- 2、判断当前的阻塞队列是否已满,如果未满,则将提交的任务放置在阻塞队列中,否则,进入第三步骤
- 3.判断线程池中的所有线程是否都在执行任务,如果没有,则创建一个新的线程来执行任务,否则,则交给饱和策略进行处理。
分类
线程池的生命周期:
Running:能接受新提交的任务,并且也能处理阻塞队列中的任务。
Shutdown:关闭状态,不再接受新提交的任务,但却可以继续处理阻塞队列中已保存的任务。
Stop:不能接受新的任务,也不再处理队列中的任务,会中断正在处理的线程。
Tidying:如果所有的任务都已中止了,workerCount有效线程数为0,线程池进入该状态后会调用terminated() 方法进入Terminated状态。
Terminated:在terminated方法执行完后进入该状态,默认terminated()方法中什么也没有做。
线程池的创建
corePoolSize:核心线程数
maximumPoolSize:线程池能创建的线程的最大个数
keepAliveTime:空闲线程能存活的时间
unit:时间单位,为keepAliveTime指定时间单位
workQueue:阻塞队列,用于保存任务的阻塞队列
ThreadFactory:创建线程的工程类
handler:饱和策略
execute方法执行逻辑
- 如果当前运行的线程少于corePoolSize,则会创建新的线程来执行新的任务。
- 如果运行的线程个数等于或者大于corePoolSize,则会将提交的任务存放在阻塞队列workQueue中,
- 如果当前的workQueue队列已满的话,则会创建新的线程来执行任务。
- 如果线程个数已经超过了maximumPoolSize,则会使用饱和策略(拒绝策略)来进行处理。
线程池的关闭
- 关闭线程池,可以通过shutdown和shutdownNow两个方法
- 原理:遍历线程池中的所有线程,然后依次中断。
- 1.shutdownNow:首先将线程池的状态设置为Stop,然后尝试停止所有的正在执行和未执行任务的线程,并返回等待执行任务的列表。
- 2.shutdown:只是将线程池的状态设置为shutdown状态,然后中断所有没有正在执行任务的线程。