线程池的执行流程

一、什么是线程池

线程池,按照配置参数(核心线程数、最大线程数等)创建并管理若干线程对象,没有任务的时候,这些线程都处于等待空闲状态。如果有新的线程任务,就分配一个空闲线程执行。如果所有线程都处于忙碌状态,线程池会创建一个新线程进行处理或者放入队列(工作队列)中等待。

二、线程池的优点

1、重用存在的线程,减少对象创建销毁的开销。

2、可有效的控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞
争,避免堵塞。

3、提供定时执行、定期执行、单线程、并发数控制等功能。

4、提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。

三、线程池的执行流程

  • 提交一个新线程任务,线程池会分配一个空闲线程,用于执行线程任务;
  •  如果线程池中不存在空闲线程,则线程池会判断当前“存活的线程数”是否小于核心线程数corePoolSize。如果小于核心线程数corePoolSize,线程池会创建一个新的线程(核心线程)去处理新线程任务;如果大于核心线程数corePoolSize,线程池会检查工作队列,判断工作队列是否已满;
  • 如果工作队列未满,则将该线程任务放入工作队列进行等待,当线程池中出现空闲线程,将从工作队列中按照先进先出的规则取出一个线程任务并分配执行;如果工作队列已满,则判断线程数是否超过最大线程数maximumPoolSize;
  • 如果没有超过最大线程数maximumPoolSize,则创建一个新线程(非核心线程)执行新线程任务;如果已经超过最大线程数maximumPoolSize,则直接采用拒绝策略处理新线程任务。

 综上所述,执行顺序为:核心线程、工作队列、非核心线程、拒绝策略。

线程池的执行流程_第1张图片

四、线程池的状态

线程池的状态分为:RUNNING , SHUTDOWN, STOP, TIDYING, TERMINATED。 

RUNNING:运行状态,线程池被一旦被创建,就处于RUNNING状态,并且线程池中的任务数为0。该状态的线程池会接收新任务,并处理工作队列中的任务。

SHUTDOWN:关闭状态,调用线程池的shutdown()方法,可以切换到
SHUTDOWN关闭状态,该状态的线程池不会接收新任务,但会处理工作队列中的任务。

STOP:停止状态,调用线程池的shutdownNow()方法,可以切换到
STOP停止状态,该状态的线程不会接收新任务,也不会处理阻塞队列中的任务,而且会中断正在运行的任务。

TIDYING:整理状态,当工作队列为空时,并且线程池中执行的任务也为空时,线程池进入
TIDYING状态,该状态表明所有的任务已经运行终止,记录的任务数量为0。

TERMINATED: 终止状态,terminated()执行完毕,进入TERMINATED状态,该状态表示线程池彻底关闭。

线程池的执行流程_第2张图片

 

你可能感兴趣的:(java,jvm,开发语言)