学习笔记——线程池的理解

学习笔记——线程池的理解


为什么使用线程池?

统一管理线程,减少线程创建和销毁次数,提高线程使用率,节约资源。

创建线程池的7个参数的作用

① corePoolSize:核心线程数,线程池启动时就会创建的线程数量。当核心线程数设置为0,添加任务优先提交到任务队列。当核心线程数不为零,表示当前可执行的最大线程数(受CUP线程数限制)
② maximumPoolSize:最大线程数,线程池中最大的线程数量。
③ keepAliveTime:闲置线程最大的存活时间,当allowsCoreThreadTimeOut设置为true时当前所有闲置线程都可以被销毁,当allowsCoreThreadTimeOut设置为false时只能销毁除核心线程外的闲置线程
④ unit:闲置线程最大的存活时间参数的单位
⑤ workQueue:缓存异步任务的队列。
⑥ threadFactory:线程工厂,用来构造线程池里的worker线程。
⑦ RejectedExecutionHandler:饱和策略。队列已满,而且当前线程数已经超过最大线程数时的异常处理策略。

线程池工作流程

① 当核心线程为0:
提交任务到线程池->添加任务到工作队列
->添加成功,当前线程数为0->创建线程,按任务队列依次执行任务
->添加成功,当前线程数不为0->使用已有线程按任务队列依次执行任务
->添加失败,当前线程数已达最大线程数->执行饱和策略
->添加失败,当前线程数未达最大线程数->新开线程,执行当前线程
② 当核心线程不为0:
提交任务到线程池->判断核心线程是否有空闲
->有,则执行任务
->没有,则添加任务到工作队列->同核心数为0的流程

一般核心线程数设置,参照AsyncTask设置为2-4个,其设置源码如下:

private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;

猜你喜欢

转载自blog.csdn.net/TomCat0916/article/details/81901604