线程池初始化之后,池中的线程数量为0,接收到任务之后开始创建线程
线程池接收任务的过程:
1.如果当前线程池中的线程数量小于CORE_POOL_SIZE,则直接创建线程 mThreadFactory 的 newThread 方法
2.如果当前线程池中的线程数量等于CORE_POOL_SIZE,而且队列mWorkQueue未满,则把任务放入队列
3.如果当前线程池中的线程数量等于CORE_POOL_SIZE,而且队列mWorkQueue已满,
则在线程池中创建新线程,线程池中的线程数量增加
4.如果当前线程池中的线程数量等于MAXIMUM_POOL_SIZE,并且队列mWorkQueue已满,
则异常异常:回调RejectedExecutionHandler的rejectedExecution方法
5.任务执行完之后,线程池中多余的线程(当前数量 - CORE_POOL_SIZE)在KEEP_ALIVE时间后背销毁,
线程池大小瘦身到 CORE_POOL_SIZE 或小于 CORE_POOL_SIZE
6.
所以,线程池的最大并发数为 MAXIMUM_POOL_SIZE
一定时间内能接受的任务数量为 MAXIMUM_POOL_SIZE + WORK_QUEUE_SIZE
所以可以根据实际需求,调整 CORE_POOL_SIZE MAXIMUM_POOL_SIZE 和 WORK_QUEUE_SIZE
PS:
AsyncTask中实现的 THREAD_POOL_EXECUTOR 的参数根据CPU核心数:
CPU_COUNT = Runtime.getRuntime().availableProcessors();
CORE_POOL_SIZE = CPU_COUNT + 1;
MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
KEEP_ALIVE = 1;
任务队列的大小为128