日常开发中我们常常使用到线程池,其能有效管理线程资源,避免过多线程导致系统资源浪费、又能复用线程资源,避免频繁的创建/销毁线程。在Android中线程池的实现为ThreadPoolExecutor类,本文主要记录该类相关的知识点。
线程池的六大参数
corePoolSize
该参数描述核心线程的数量,线程池中分为核心线程和非核心线程,其本质都是线程,但是核心线程在空闲时一般不会被回收,除非设置了allowCoreThreadTimeOut=true.而非核心线程在空闲后会被回收(回收时间受keepAliveTime参数控制)。
maximumPoolSize
该参数描述非核心线程的数量
keepAliveTime
该参数描述空闲线程的存活时间,一个线程(常常是非核心线程)空闲keepAliveTime时间后,会被回收调。
unit
该参数是描述keepAliveTime存活时间的单位,常见的有毫秒和秒
workQueue
该参数是存储任务的队列,通过execute方法递交的runnable会存储在该参数中
threadFactory
该参数是用来创建线程的工厂类,当线程池中需要新建线程时,会调用该参数的newThread方法创建线程
执行流程
线程池的执行流程中主要涉及到上述到六个参数。当调用execute方法添加一个runnable时,流程如下
- 如果当前存活的线程数小于corePoolSize,调用thread的newThread新建核心线程执行任务
- 如果当前线程数大于等于corePoolSize,则将该任务添加到对应的workQueue队列中,如果添加成功,则等待执行,否则进行第三步
- 如果存活线程数小于最大线程数,则新建非核心线程执行该任务,如果存活线程已达到最大线程数,则调用RejectExecutionHandler的rejectExecution方法通知调用者。
常见线程池
线程池分类 | 关键参数 | 适用场景 |
---|---|---|
FixedThreadPool | coreSize=size maximumPoolSize=size | 快速响应的任务,因为其核心线程不会被回收 |
CacheThreadPool | coreSize=0 maximumPoolSize=Integer.MAX | 大量的、耗时短的任务 |
ScheduledThreadPool | coreSize=size maximumPoolSize=Integer.MAX | 定时任务或固定周期任务 |
SingleThreadPool | coreSize=1 maximumPoolSize=1 | 单线程执行所有任务 |