android 线程池(原理及分析)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wk_beicai/article/details/78888859
1.1 线程池的三大优点:
1)避免因为线程的创建和开销所带来的性能开销,
2)能有效的控制线程池的最大并发数,避免大量线程间因为抢占系统资源而导致的堵塞现象
3)能对线程进行简单的管理,提供定时执行以及指定间隔循环执行功能

android中的线程池概念来源于java中Exector,Exector是一个接口,真正的线程池实现为ThreadPoolExector,ThreadPoolExector提供了一系列参数来配置线程池,通过不同的参数可以创建不同的线程池。

2.1 ThreadPoolExector
ThreadPoolExector是线程池真正的实现,它的构造方法通过一系列参数来配置线程池,这些参数将会影响到线程池的功能,
eg:

corePoolSize:线程池的核心线程数:默认情况下,核心线程会在线程池中一直存活,即时处于闲置状态,如果将ThreadPoolExecutor的allowCoreThreadTimeOut属性设置为true,核心线程就会被终止。
maximumPoolSize:线程池所能容纳线程最大数量,如果超过这个数值,后续的任务将会被阻塞。
keepAliveTime
非核心线程闲置时的超时时长,也就是说超过这个时长,非核心线程就会被回收,
unit: 用于指定keepAliveTime参数的时间单位,常用的有毫秒,秒,分钟
workQueue: 线程池中的任务队列,通过线程池的execute方法提交的runable对象会存储在这个参数中;
阻塞队列有以下几种选择:
1)ArrayBlockingQueue: 基于数组先进先出队列,创建必须指定大小
2)PriorityBolckingQueue: 一个无界的阻塞队列
3)LinkedBlockingQueue: 基于列表先进先出队列,如果创建时没有指定大小,默认Integer.MAX_CALUE
4)SynchronousQueue:不会保存提交的任务,直接建一个新的线程来执行任务;

threadFactory: 线程工厂,为线程池提供创建新线程的功能,threadFactory是一个接口,她只有一个方法,Thread new Thread(Runable r)

ThreadPoolExecutor执行任务时,大致遵循如下规则;
1)线程池中的数量未达到核心线程数量,直接启动一个核心线程执行任务。
2)如果线程池中的线程数量已经超过核心的线程数量,那么任务将会插入到任务队列中等待执行
3)如果无法插入到任务队列中,这往往由于任务队列已满,这个时候线程数量未达到线程池规定的
最大值,那么立刻启动一个非核心线程来执行任务。
4)如果步骤三种的线程数量已经达到线程池中规定的最大值,那就拒绝执行此任务

3.1 线程池的分类:
1)FixedThreadPool(快速响应外界请求)
通过Executor的newFixedThreadPool方法创建,是一个线程数量固定的线程池,当处于空闲状态时,他不会被回收,除非线程池被关闭,当所有线程处于活动状态时,新任务处于等待状态,直到有线程闲下来,由于FixedThreadPool只有核心线程,并且这些核心线程不会被回收,意味着更加快速的影响外界请求,(FixedThreadPool中只有核心线程并且核心线程没有超时机制,任务队列也没有大小限制;)

2)CachedThreadPool
通过Executor的newCachedThreadPool方法创建,它是一种线程数量不定的线程池,他只有非核心线程池,并且最大线程数为Integer.MAX_VALUE;由于这个值很大。我们可以理解为最大线程数可以任意大,当线程处于活动状态时,线程池会创建新的线程来处理新的任务,否则利用空闲的线程来处理新的任务,
线程池中的空闲线程都有超时机制,时长60秒,超过60秒被回收,CachedThreadPool的任务队列相当于一个空的集合,将导致任何任务都会被立即执行,在这种场景SynchronousQueue是无法插入任务,(SynchreonousQueue是一个无法存储元素的队列),这类线程池比较适合执行大量的耗时较少的任务。当整个线程池都处于闲置状态时,线程池中的线程都会超时而被停止,

3)ScheduledThreadPool
通过Executor的newScheduledThreadPool方法创建,核心线程数量是被固定的,非核心线程数是没有限制的,当非核心线程闲置时会被立即回收,ScheduledThreadPool这类线程池主要用于执行定时任务和具有固定周期的重复任务,

4)SingleThreadExecutor
通过Executors的newSingleThreadExecutor方法创建,这类方法只有一个核心线程,确保所有任务都在同一个线程中按顺序执行,SingleThreadExecutor统一所有外界任务到一个线程中,这使得在这些任务之间不需要处理线程同步的问题


Exector与Exectors区别:
Exector是一个接口,其中有一个execte()方法(执行方法)
Exectors是一个没有继承任何类的方法,作为一个工厂方法类,用于创建形形色色的线程池对象。

猜你喜欢

转载自blog.csdn.net/wk_beicai/article/details/78888859