线程池
线程池的优点
- 线程池中的线程可以重用,减少线程创建、销毁带来的系统开销;
- 控制线程池的最大并发量,避免相互抢占系统资源而导致阻塞;
- 对线程进行简单管理,提供定时执行,以及指定间隔循环执行;
ThreadPoolExecutor构造方法
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory)
参数说明:
-
corePoolSize
线程池的核心数
-
maximumPoolSize
线程池能容纳的最大线程数
-
keepAliveTime
非核心线程闲置时间的超时时长,超过这个时长,非核心线程就会被回收。ThreadPoolExecutor的allowCoreThreadTimeOut属性为true,keepAliveTime同样会作用于核心线程。
-
unit
超时时长的单位,常用的有TimeUnit.MILISECONDS\TimeUnit.SECONDS\TimeUnit.MINUTES等
-
workQueue
线程池中的任务队列,通过线程池的execute方法提交Runnerable对象会存储在这个参数中
-
threadFactory
线程工厂
ThreadPoolExecutor执行任务的规则
设:nThreadNow: 为当前线程数量; nCore: 核心线程数量; nPoolMax: 线程池最大值
- nThreadNow < nCore, 启动一个核心线程来执行任务;
- nThreadNow >= nCore && 工作队列未满, 将任务插入到工作队列;
- 工作队列已满 && nThreadNow < nPoolMax, 立即启动一个非核心线程来执行任务;
- nThreadNow >= nPoolMax, 拒绝执行此任务
线程池的分裂
Android中有四种常见的线程池:
-
FixedThreadPool
- 线程数量固定
- 当线程处于空闲状态时,不会被回收
- 当所有的线程处于活动状态时,新任务都会处于等待状态,直到有线程空闲出来
- 只有核心线程
- 没有超时机制
- 任务队列没有大小限制
-
CachedThreadPool 适用于执行大量耗时较少的任务
- 线程数量不固定
- 只有非核心线程
- 线程池中的线程都处于活动状态,新建线程来处理新任务;否则利用空闲线程处理新任务
- 空闲线程都有超时机制
-
ScheduledThreadPool 适用于执行定时任务、具有固定周期的重复任务
- 核心线程数量固定
- 非核心线程数没有限制
- 非核心线程闲置时会被立即回收
-
SingleThreadPool
- 内部只有一个核心线程
- 确保所有任务都在同一个线程中按顺序执行