一.概述
在日常开中,如果经常使用到线程的话,如何快捷创建和关闭回收线程是一件较为麻烦的事情,因此 阿里巴巴的Java规范插件 一直都是建议使用线程池来管理线程
使用线程池有那些好处?
- 复用存在的线程,减少线程的创建,减少线程的开销,进一步提高了效率
- 通过阻塞队列来控制最大的线程并发数,让内存等消耗限制在一个合理的范围内
二.线程池的相关参数
我们要怎么使用线程池呢?我们先来看下线程池参数最全面的构造方法吧:
/**
* 创建一个线程池
*
*
* @param corePoolSize 核心线程数量,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中
* 当线程池里面的线程数量超过corePoolSize就会启动回收操作
*
* @param maximumPoolSize 线程池里面的最大线程数
*
* @param keepAliveTime 表示线程空闲时多久才将其回收,只有当线程池里面的线程数量超过corePoolSize才会生效,
* 它会让线程池里面的线程数量尽量等于或接近corePoolSize
*
* @param unit keepAliveTime的时间单位
*
* @param workQueue 阻塞队列,用来存储等待执行的任务,等待线程池里面有空闲的线程来执行任务
*
* @param threadFactory 用来生产线程的工厂
*
* @param handler 当任务无法处理时的策略
*
*/
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
在明白了相关参数配置后,我们就可以开始依据自己需求来定制线程池了,可能你还是有点无从下手的感觉,没事,我们可以先看下其他人是怎么定制的,比方说看下 Glide 是怎么定制自己内部的线程池的
三.Glide 中定制的几个线程池
我们可以在 Glide 的 GlideExecutor
里面找到它定制的线程池,Glide 定制了 4 个 线程池
1.newDiskCacheExecutor
这是用于执行本地缓存任务的线程池
public static GlideExecutor newDiskCacheExecutor(
int threadCount, String name, UncaughtThrowableStrategy uncaughtThrowableStrategy) {
return new GlideExecutor(
new ThreadPoolExecutor(
threadCount /* corePoolSize,数值为1 */,
threadCount /* maximumPoolSize,数值为1 */,
0 /* keepAliveTime为0 */,
TimeUnit.MILLISECONDS,
/*无序的阻塞队列,先进先出 */
new PriorityBlockingQueue<Runnable