Android中线程池的概念源自Java中的Executor,Executor是一个接口,真正的实现类是ThreadPoolExecutor,ThreadPoolExecutor构造方法中有一系列参数来配置线程池的属性:
ThreadPoolExecutorcorePoolSize——核心线程数,一直保存在线程池中的线程,处于空闲状态也不会销毁,除非allowCoreThreadTimeOut属性值设置为true,此时核心线程空闲状态超出keepAliveTime设置的时间时就会被销毁;
maximumPoolSize——最大线程数,某些类型的线程池中,如果所有的核心线程都处于活动状态,此时进来新任务线程池就会创建非核心线程,去执行新任务,当线程池中的线程数超过这个值,新进来的任务就会进入任务队列等待,直到有空闲出来的线程去执行;
keepAliveTime——非核心线程空闲超时时间,非核心线程空闲的时间超过这个值,那么将会销毁回收,当allowCoreThreadTimeOut属性设置为true时,核心线程也会受其影响;
unit——时间单位,是一个时间枚举类,常用的有MILLISECONDS(毫秒)、SECONDS(秒)、MINUTES(分钟)等;
workQueue——任务队列,当线程池中没有空闲线程去执行任务时,放到任务队列中等待。
Android中5种线程池:
1、FixedThreadPool
FixedThreadPool这种线程池创建的时候核心线程数即为最大线程数,只有核心线程,没有非核心线程,当线程池中所有线程都处于活动状态时,新进来的任务会在任务队列中等待,直到有线程空闲出来去执行,所以这种线程池的任务队列没有大小限制,同时因为都是核心线程,所以也没有超时机制。
2、CacheThreadPool
CacheThreadPool这种线程池创建的时候核心线程数为0,只有非核心线程,因为非核心线程在空闲一段时间会被回收,所以这种线程池的线程数量是不定的。由于只有非核心线程,并且最大线程数为Integer.MAX_VALUE,线程池中的线程上限非常大,新进来的任务在没有空闲线程时基本都会去新建,所以这种线程池中的任务队列基本用不上。同时由于线程池中都是非核心线程,在空闲的时候会回收,所以这种线程池适用于大量并且耗时少的场景,在执行完任务后,所有线程都会回收,几乎不再占用系统资源。
3、ScheduledThreadPool
ScheduledThreadPool这种线程池创建的时候传入核心线程数,核心线程数是固定的,最大线程数为Integer.MAX_VALUE,超时时间为10ms(DEFAULT_KEEPALIVE_MILLIS=10L,MILLISECONDS),所以非核心线程在空闲状态会立马回收,这类线程池主要用于执行定时任务和周期任务。
4、SingleThreadExecutor
SingleThreadExecutor这种线程池创建的时候核心线程数和最大线程数都为1,线程池中只有一个核心线程,这个线程池确保所有的任务都在同一个线程中按顺序执行,意义在于将外界所有任务统一到一个线程中执行,使得这些任务之间不需要去处理线程同步问题。
5、WorkStealingPool
WorkStealingPool这个线程池是在Java 1.8出现的,这种线程池中会将任务按线程数均分,先工作完的线程回去帮助其他线程,达到最快完成任务的目的。上面4中线程池,要么是线程固定,要么是线程数最大值太大,容易造成内存溢出,所以在1.8后推出这种线程池。
网友评论