线程池简介:
android提供了四种线程池,都是由直接或简介配置ThreadPoolExecutor来实现的。
线程池存在的意义:
1.重用线程池中的线程,来减少开启线程和关闭线程的性能开销。
2.控制线程数量,避免大量的线程抢占系统资源而引起的堵塞现象,表现为手机卡顿。
3.对线程做到简单的管理,提供定时执行或指定间隔循环执行等功能。
ThreadPoolExecutor
实现了来自Executor接口。
public interface Executor {
void execute(Runnable command);
}
重要参数:
1.corePoolSize:核心线程的数量,默认核心线程在线程池中一直存活,即便处于闲置状态,但当设置allowCoreThreadTimeOut 为ture 他就会和非核心线程一样,受keepAliveTime控制。
2.maximunPoolSize:最大线程数。核心线程+非核心线程。
3.allowCoreThreadTimeOut:刚刚说过。。
4.keepAliveTime:时间
5.TimeUnit:时间单位
6.ThreadFactory:线程工厂,创建线程的方式。本身是一个接口,只有一个方法。
7.blockingQueue<runnable> :任务队列。
工作流程:
1.线程池的线程数量没有达到核心线程数,创建新的核心线程执行任务。
2.线程池数量达到核心线程数,把任务插入任务队列中。
3.任务队列也满了,开启非核心线程来执行任务。
4.线程池总线程数达到上限,该任务不执行,线程池通过RejectExecuteHandler的rejectExecute方法通知调用者。
小demo
/**
* 串行执行多线程任务 第一种 使用线程池
*/
//任务队列。android 提供有:LinkedBlockingQueue ArrayQueue ArrayBlockQueue 区别自己百度吧。
LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100);
//线程工厂
ThreadFactory threadFactory = new ThreadFactory(){
@Override
public Thread newThread(@NonNull Runnable r) {
return new Thread(r);
}
};
//设置一个核心线程数为1,最大线程数为5,任务队列最大容量为100,闲置关闭时间为1秒的线程池
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 5, 1l, java.util.concurrent.TimeUnit.SECONDS, workQueue, threadFactory);
public void executeByExecutor(Runnable runnable){
threadPoolExecutor.execute(runnable);
}
android中的四种线程池。
-
FixedThreadPool:线程总数就是核心线程数,不设置闲置超时关闭。使用LinkedBlockingQueue并且不设置最大任务数。 能够极快的响应外界请求。
-
CachedThreadPool:线程总数就是非核心线程数,核心线程数为0,并且数量为Integer.Max_VALUE,有超时时间,60s,使用SynchronousQueue,实际上这个任务队列并不能存储元素。闲置时不占用过多资源,适合执行大量的耗时较少的任务。
-
ScheduleThreadPool:核心线程数固定,非核心线程数是Integer.MAX_VALUE,非核心线程闲置时会被马上回收,闲置超时时间是0,使用DelayedWorkQueue(),主要用于执行定时任务和具有固定周期的重复任务。
-
singleThreadPool:一个核心线程,没有非核心线程,使用LinkedBlockingQueue不设置队列长度,目的是把所有任务放到一个线程中按顺序执行,实现了串行并且不需要考虑同步的问题。
网友评论