线程池

2021-04-30  本文已影响0人  caster

1. 线程池原理

使用线程池的好处:

线程池的基本实现
通过ThreadPoolExecutor类可以通过以下属性构造一个线程池:

构造函数成员变量 说明
corePoolSize 池中保留的核心线程数,即使空闲也保留,除非设置了allowCoreThreadTimeOut
maximumPoolSize 池中可放的最大线程数
keepAliveTime 当池中线程数量大于corePoolSize值时,空闲线程终止前等待新任务的最大时间
unit keepAliveTime的时间单位
workQueue 用来保存尚未执行的execute方法提交的Runnable 任务
threadFactory 用于创建工作线程worker的工厂
handler 当线程池和队列都满了需要进行的饱和策略,由4个内部类构成4中策略

ThreadPoolExecutor可用的workQueue为实现BlockingQueue接口的阻塞队列,可用以下几种队列(建议使用有界队列):

workQueue队列 说明
ArrayBlockingQueue 基于数组的有界阻塞队列,先进先出
LinkedBlockingQueue 基于链表的阻塞队列,先进先出,Executors.newFixedThreadPool()使用了此种队列
SynchronousQueue 不存储元素,每个插入操作都必须等待另一个线程执行相应的删除操作,否则插入操作一直阻塞,Executors.newCachedThreadPool() 使用了此种队列
PriorityBlockingQueue 具有优先级的无界阻塞队列

ThreadPoolExecutor中4种饱和策略类如下:

内部饱和策略处理类 说明
CallerRunsPolicy 调用当前线程池的所在的线程去执行被拒绝的任务,如果是主线程构造的线程池,会阻塞主线程
AbortPolicy 直接抛出异常
DiscardPolicy 不作处理,相当于直接丢弃当前任务
DiscardOldestPolicy 丢弃队列里面最近的任务,并execute当前任务

ThreadPoolExecutor类中其他重要的属性如下:

重要属性 说明
workers:HashSet<Worker> 内部类Worker的一个集合,Worker为线程池内的工作线程实现类,其run()方法会不断从workQueue 中获取任务来执行
ctl:AtomicInteger 包含了线程池的运行状态和worker线程个数
... ...

ThreadPoolExecutor类中重要的方法如下:

重要方法 说明
execute(Runnable) 添加一个任务到线程池,方法内会调用addWorker方法初始化或者扩充线程池的工作线程
addWorker(Runnable,boolean) 添加一个工作线程到线程池:参数1可以指派此线程的第一个任务,参数2指定范围是corePoolSize还是maximumPoolSize,超过范围直接返回false,创建失败
... ...

线程池处理任务的工作流程
线程池处理任务的流程即execute(Runnable)方法的流程,分为以下三步:

线程池的状态
ctl属性中包含了线程池的状态信息,共以下四种:

线程池状态 说明
RUNNING 接受新的任务并处理workQueue中的任务
SHUTDOWN 不接受新的任务但处理workQueue中的任务
STOP 不接受新的任务且不处理workQueue中的任务(中断任务)
TIDYING 所有任务都结束,workerCount值为0,并运行terminated()方法
TERMINATED terminated()方法运行结束,线程池终止

状态转换流程如下图所示:


线程池运行状态转换流程

2. 线程池使用

创建线程池
提交任务
监控线程池
关闭线程池

3. 线程池框架

Executor是JDK5开始提供的线程执行机制框架,负责调控执行线程的工作单元Runnable和Callable。Executor框架组成如下如所示:


Executor框架组成
ThreadPoolExecutor类线程池 说明
SingleThreadExecutor 单个线程的线程池,使用无界队列LinkedBlockingQueue
FixedThreadPool 固定线程数的线程池,使用无界队列LinkedBlockingQueue
CachedThreadPool 线程数量无界的线程池,使用无容量队列SynchronousQueue
ScheduledThreadPoolExecutor类线程池 说明
SingleThreadScheduledExecutor 单个线程的用于周期任务线的程池
ScheduledThreadPool 多个线程的用于多个周期任务线的程池
上一篇 下一篇

猜你喜欢

热点阅读