400 028 6601

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

Android线程池

前言

创新互联建站专注于企业营销型网站、网站重做改版、历城网站定制设计、自适应品牌网站建设、成都h5网站建设商城网站开发、集团公司官网建设、外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为历城等各大城市提供网站开发制作服务。


线程池是一个很重要概念,在初学时我们都是通过new Thread来开启一个线程进行联网操作,但是跟服务端交互多了,如果还是使用new Thread()来开启子线程,在一个应用中我们频繁的去通过这个方法去开启线程,这对性能来说是很大的浪费,频繁的开启销毁线程对内存的消耗是很大的,而频繁的开启线程也让整个应用的线程管理显得很混乱,这是不可取的,这时候使用线程池就可以解决这些问题了,这篇文章我会尝试将线程池概念和应用说清楚。


1.线程的运行机制


  • 开启线程过多,会消耗cpu

  • 单核cpu,同一时刻只能处理一个线程,多核cpu同一时刻可以处理多个线程

  • 操作系统为每个运行线程安排一定的CPU时间—-时间片,系统通过一种循环的方式为线程提供时间片,线程在自己的时间内运行,因为时间相当短,多个线程频繁地发生切换,因此给用户的感觉就是好像多个线程同时运行一样,但是如果计算机有多个CPU,线程就能真正意义上的同时运行了. 
    Android线程池

2.线程池的作用

  • 线程池是预先创建线程的一种技术。线程池在还没有任务到来之前,创建一定数量的线程,放入空闲队列中,然后对这些资源进行复用。减少频繁的创建和销毁对象。

  • 频繁创建和销毁线程耗资源,耗时间

  • 因为有的线程执行时间比创建和销毁一个线程的时间还长`

3.线程池涉及的类

4.Executors

Executors:jdk1.5之后的一个新类,提供了一些静态工厂,生成一些常用的线程池,ThreadPoolExecutor是Executors类的底层实现

1.newSingleThreadExecutor

创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行>所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池>保证所有任务的执行顺序按照任务的提交顺序执行。

2.newFixedThreadPool

创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

3.newCachedThreadPool

创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程, 
那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。

4.newScheduledThreadPool

创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

5.ThreadPoolExecutor介绍

//构造方法
public ThreadPoolExecutor(int corePoolSize,//核心池的大小
                              int maximumPoolSize,//线程池最大线程数
                              long keepAliveTime,//保持时间
                              TimeUnit unit,//时间单位
                              BlockingQueue workQueue,//任务队列
                              ThreadFactory threadFactory,//线程工厂
                              RejectedExecutionHandler handler) //异常的捕捉器

构造相关参数解释

基础API的介绍

任务提交给线程池之后的处理策略

  1. 如果当前线程池中的线程数目小于corePoolSize,则每来一个任务,就会创建执行这个任务;

    Android线程池

  2. 如果当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到任务缓存队列当中 

    1. 若添加成功,则该任务会等待空闲线程将其取出去执行;Android线程池

    2. 若添加失败(一般来说是任务缓存队列已满),则会尝试创建新的线程去执行这个任务;Android线程池

  3. 如果当前线程池中的线程数目达到maximumPoolSize,则会采取任务拒绝策略进行处理;

    Android线程池

  4. 如果线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止,直至线程池中的线程数目不大于corePoolSize;如果允许为核心池中的线程设置存活时间,那么核心池中的线程空闲时间超过keepAliveTime,线程也会被终止。

任务提交给线程池之后的处理策略_比喻

假如有一个工厂,工厂里面有10(corePoolSize)个工人,每个工人同时只能做一件任务。

因此只要当10个工人中有工人是空闲的,来了任务就分配给空闲的工人做;

当10个工人都有任务在做时,如果还来了任务,就把任务进行排队等待(任务队列);

如果说新任务数目增长的速度远远大于工人做任务的速度,那么此时工厂主管可能会想补救措施,比如重新招4个临时工人(创建新线程)进来;然后就将任务也分配给这4个临时工人做;

如果说着14个工人做任务的速度还是不够,此时工厂主管可能就要考虑不再接收新的任务或者抛弃前面的一些任务了(拒绝执行)。

当这14个工人当中有人空闲时,而且空闲超过一定时间(空闲时间),新任务增长的速度又比较缓慢,工厂主管可能就考虑辞掉4个临时工了,只保持原来的10个工人,毕竟请额外的工人是要花钱的

6.阻塞队列的介绍(BlockingQueue)

阻塞队列,如果BlockingQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒,同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间时才会被唤醒继续操作。

  1. 基础API介绍

子类介绍

7.RejectedExecutionHandler介绍

实现的子类介绍

看完本文有收获?请分享给更多人


Android 干货

欢迎关注我们,扫描和长按下方的二维码可快速关注我们。或搜索微信众号:AndroidNiubility。

Android线程池

公众号:AndroidNiubility


网站名称:Android线程池
分享路径:http://mbwzsj.com/article/jidhph.html

其他资讯

让你的专属顾问为你服务