为什么使用线程池?

1、重用线程,防止频繁的创建销毁线程所带来的时间和资源等性能损耗。
2、有效的控制最大线程并发数,防止大量线程抢夺系统资源引起卡顿,合理利用系统资源。
3、对线程进行简单管理、以及线程间更好的协作工作

Android 中有哪几种线程池?

实际意义上我们所说的几种常用线程池都是 Java 封装好,都在 Executors 这个工厂类里面了,笔者使用的是 JDK8 所以发现里面有六种线程池,接下来分别介绍下

1. FixedThreadPool

数量固定的核心线程池,当线程池处于空闲时线程也不会被回收,除非线程被关闭了。如果所有线程都在运行中,再有新任务添加时新任务会处于等在状态,知道有线程空闲在运行。处于等待的任务没有数量上限

2. CachedThreadPool

这是一种线程数量不定的线程池,他只有非核心线程,线程池如果没有空闲线程,会随时创建新的线程来工作,如果空下来的线程空闲时长超过 60 秒,则会被回收。他在长时间不工作的时候内部是没有任何线程的,也就是不消耗任何资源

3. SingleThreadExecutor

只有一个核心线程的线程池,所有任务都要排队等待由唯一的一个核心线程来处理,处于等待的任务队列个数没有上限

4. ScheduledThreadPool

这是一个核心线程数量固定,非核心线程没有上限的线程池,非核心线程闲置时间超过 10 秒就会被回收(不同版本 JDK 可能不同),并且他的等待队列只有 16 个。并且支持定时及周期性任务执行。

5. SingleThreadScheduledExecutor

就是一个只有一个核心线程的 ScheduledThreadPool 线程池

6. WorkStealingPool

创建持有足够线程的线程池来支持给定的并行级别,并通过使用多个队列,减少竞争,它需要传一个并行数量,如果不传,则被设定为默认的CPU数量

自定义线程池

接下来上面提到的核心线程、非核心线程是什么,还有上面线程池的实现。
上面所有的线程池都是通过以下两个类创建的

  • ThreadPoolExecutor
  • ForkJoinPool

一、 先说一说 ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue) {this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,Executors.defaultThreadFactory(), defaultHandler);
}

看一看各项参数

  • corePoolSize:线程池的核心线程数
  • maximumPoolSize:线程池中允许的最大线程数(maximumPoolSize-corePoolSize = 非核心线程)
  • keepAliveTime:空闲线程结束的超时时间(如果 allowCoreThreadTimeOut 属性设置为 true 核心线程闲置 keepAliveTime 时间以上也会被回收,false 则不会回收)
  • unit:是一个枚举,它表示的是 keepAliveTime 的单位
  • workQueue:工作队列,用于任务的存放

运行流程

  1. 线程池创建的时候里面不会有任何线程
  2. 如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务;
  3. 如果正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入队列;
  4. 如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么还是要创建非核心线程立刻运行这个任务;
  5. 如果队列满了,而且正在运行的线程数量大于或等于 maximumPoolSize,那么线程池会抛出异常RejectExecutionException。

我们上面说的 FixedThreadPool、CachedThreadPool、SingleThreadExecutor、ScheduledThreadPool、SingleThreadScheduledExecutor 都是通过 ThreadPoolExecutor 创建的,好奇的人可以看一下源码。

二、 ForkJoinPool

ForkJoinPool 是JDK 7加入的一个线程池类。Fork/Join 技术是分治算法(Divide-and-Conquer)的并行实现,它是一项可以获得良好的并行性能的简单且高效的设计技术。目的是为了帮助我们更好地利用多处理器带来的好处,使用所有可用的运算能力来提升应用的性能。我们常用的数组工具类 Arrays 在JDK 8之后新增的并行排序方法(parallelSort)就运用了 ForkJoinPool 的特性,还有 ConcurrentHashMap 在JDK 8之后添加的函数式方法(如forEach等)也有运用。

我们上面说的 WorkStealingPool 都是通过 ForkJoinPool 创建的。

这个知识点比较复杂大家可以参考其他博客

Android 中的线程池相关推荐

  1. android中的线程池学习笔记

    阅读书籍: Android开发艺术探索 Android开发进阶从小工到专家 对线程池原理的简单理解: 创建多个线程并且进行管理,提交的任务会被线程池指派给其中的线程进行执行,通过线程池的统一调度和管理 ...

  2. android 线程池 怎么用,android中的线程池 怎么用

    满意答案 qpierq0n5 2016.05.02 采纳率:52%    等级:13 已帮助:8164人 //在Android中实现线程池,首先需要实现一个线程工厂(ThreadFactory)的子类 ...

  3. Android开发中的线程池使用

    一.前言 既然Android中已经有了线程的概念,那么为什么需要使用线程池呢?我们从两个方面给出使用线程池的原因. 首先线程的新建和销毁都是存在性能上的消耗的,如果一个时间段有大量的网络请求,那么就需 ...

  4. 【Android 异步操作】线程池 ( Worker 简介 | 线程池中的工作流程 runWorker | 从线程池任务队列中获取任务 getTask )

    文章目录 一.线程池中的 Worker ( 工作者 ) 二.线程池中的工作流程 runWorker 三.线程池任务队列中获取任务 getTask 在博客 [Android 异步操作]线程池 ( 线程池 ...

  5. 【Android 异步操作】线程池 ( 线程池使用示例 | 自定义线程池使用流程 | 自定义任务拒绝处理策略 | 完整代码示例 )

    文章目录 一.自定义线程池使用流程 二.自定义任务拒绝处理策略 三.完整代码示例 在博客 [Android 异步操作]线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTas ...

  6. 【Android 异步操作】线程池 ( 线程池 reject 拒绝任务 | 线程池 addWorker 添加任务 )

    文章目录 一.线程池 reject 拒绝任务 二.线程池 addWorker 添加任务 在上一篇博客 [Android 异步操作]线程池 ( 线程池 execute 方法源码解析 ) 中 , 讲解 线 ...

  7. Android中后台线程如何与UI线程交互

    我想关于这个话题已经有很多前辈讨论过了.今天算是一次学习总结吧. 在android的设计思想中,为了确保用户顺滑的操作体验.一些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务.因此我们必须 ...

  8. Android中的线程

    1.Android中的线程概括 线程与进程 线程:线程是CPU调度的最小单元,同时线程也是一种有限的系统资源,即线程不可能无限制的产生,并且线程的创建和销毁有开销 进程:一般指一个执行单元,在pc和移 ...

  9. Java5中的线程池实例讲解

    Java5增加了新的类库并发集java.util.concurrent,该类库为并发程序提供了丰富的API多线程编程在Java 5中更加容易,灵活.本文通过一个网络服务器模型,来实践Java5的多线程 ...

最新文章

  1. 一直学不明白的「递归」与「动态规划」原来这么简单
  2. java基础教程 类_Java零基础系列教程06初识类和对象
  3. pytorch lstm 写诗文的魔改,测试,猜想
  4. 关于http://127.0.0.1:4723/wd/hub的解释
  5. 两个unit取和会溢出吗_TCP 三次握手原理,你真的理解吗?
  6. 没想到,Python还可以制作Web可视化页面!
  7. c语言学习之基础知识点介绍(十):数组
  8. 隐马尔科夫模型(HMM)笔记(公式+代码)
  9. windows录屏_电脑自带录屏软件怎么打开?详细操作教程
  10. python时间控件遮罩层_jquery遮罩层插件
  11. 服务启动失败_将控制台程序转换为服务运行
  12. centen os7安装maven
  13. 天正电气lisp是什么文件_LSP文件扩展名 - 什么是.lsp以及如何打开? - ReviverSoft...
  14. 怎么批量删除 Excel 中第一个工作表或者其它指定的工作表?
  15. 听说想当黑客的都玩过这个Monyer游戏
  16. win8虚拟机_老司机教你如何在虚拟机安装win8系统,双系统也可以这样实现
  17. 聊一聊SEO(搜索引擎优化)
  18. 【尚医通】手机登录功能
  19. android逻辑分辨率,手机ui设计dpi如何把握,看这3个平台各自的画布设置情况
  20. 阿里/京东入局,多家年营收过亿公司诞生,解析居家护理市场三大趋势

热门文章

  1. 小程序表单提交,服务端推送模板消息通知
  2. js中字符串类转为日期类,并比较
  3. clickhouse 的mysql表引擎
  4. VB6.0中创建和使用文本资源文件
  5. 年总结(二):历经一年的蜕变
  6. 北大教授证明黎曼猜想?但在前一天取消了
  7. DeepMind和Unity合作,创建虚拟世界来训练AI
  8. 李彦宏谈无人车:高速上吃着火锅唱着歌,再有三五年能代替司机
  9. 亚马逊无人超市Amazon Go这次是真的真的开业了
  10. 数据计算中间件技术综述