文章目录

  • 一、线程池简介
  • 二、线程池初始化方法简介
  • 三、线程池使用示例

一、线程池简介


线程池一般是实现了 ExecutorService 接口的类 , 一般使用 ThreadPoolExecutor 线程池 ;

线程池优势 :

减少线程对象个数 : 避免每次执行子线程任务时 , 都要执行 new Thread() 构造函数 , 避免每次创建一个新的对象 , 减少开销 ;

线程管理 : 方面对线程进行管理 , 已存在的线程直接重用 , 这样减少了线程对象创建的个数 , 降低了 CPU 资源开销 ;

控制并发数 : 每个 CPU 都有最合适的并发线程数 , 如果并发数过高 , 就会导致资源竞争 , 线程堵塞 , 合理控制并发数 , 能提高 CPU 使用效率 ;

二、线程池初始化方法简介


线程池初始化方法简介 :

newCachedThreadPool : 创建 可缓存线程池 ; 如果线程池长度超过处理需要 , 则回收线程 , 如果不能回收 , 就创建新线程 ;

newFixedThreadPool : 创建 定长线程池 ; 可以设置线程最大并发数 , 如果并发数已满 , 后续任务会在任务队列中等待 ;

newScheduledThreadPool : 创建 定长周期任务线程池 ; 该线程池支持周期性任务执行 ;

newSingleThreadExecutor : 创建 单线程化线程池 ; 该线程只有一个工作线程 , 可以保证所有任务按照指定的顺序执行 ; 如 FIFO 先进先出顺序 , 或 LIFO 后进先出顺序 ;

三、线程池使用示例


以 AsyncTask 源代码为例 , 在 SerialExecutor 中 , 最终使用的是 THREAD_POOL_EXECUTOR.execute(mActive) 执行线程任务 ; 线程池通过 execute 函数执行外部任务 ;

THREAD_POOL_EXECUTOR 是 自己配置的线程池 , 没有使用 Java 默认提供的四种线程池 , Java 提供的四种线程池是 可缓存线程池 , 定长线程池 , 定长周期任务线程池 , 单线程线程池 ;

THREAD_POOL_EXECUTOR 线程池配置代码如下 :

new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory,new ThreadPoolExecutor.DiscardOldestPolicy());

下面对 THREAD_POOL_EXECUTOR 自己配置的线程池参数进行说明解析 ,

CORE_POOL_SIZE 核心线程数 ,

MAXIMUM_POOL_SIZE 最大线程数 , 非核心线程就是二者相减 ,

KEEP_ALIVE 非核心线程闲置时间 , 超过一定时间非核心线程就会回收 ,

TimeUnit.SECONDS 非核心线程闲置时间单位 “秒” ,

sPoolWorkQueue 线程池任务队列 ,

sThreadFactory 线程工厂 , 作用是用于创建线程

线程池原理说明 :

线程池线程分类 : 线程池的线程分为 核心线程 , 非核心线程 两类 ;

非核心线程闲置时间 : 非核心线程 超过一定的闲置时间 , 就会被回收 ;

假设线程池最大线程数是 888 , 核心线程数 333 , 非核心线程数 555 ;

线程池任务队列 : 当启动一个线程池后 , 线程池会不停地从该任务队列中取出任务执行 ,

  • 启动核心线程 : 如果当前核心线程没有满 , 小于 333 个 , 那么创建核心线程执行该任务 ,

  • 启动非核心线程 : 如果当前核心线程已经有 333 个 , 但是 非核心线程没有满 , 小于 555 个 , 那么会创建非核心线程 , 执行该任务 ;

执行者 Executor 执行任务处理 : 如果核心线程数 有 333 个 , 非核心线程数有 555 个 , 最大线程数已满 ; 如果用户再提交任务给线程池 , 就会 将任务放入线程池任务队列中排队 ; 如果此时任务队列也满了 , 此时就会 抛出异常 ; 开发者应该通过回调处理被拒绝的任务 ;

线程池从任务队列取出任务并执行 : 线程数量 CCC

  • 线程数量 C<3C < 3C<3 : 创建核心线程执行任务 ;
  • 线程数量 3≤C<83 \leq C < 83≤C<8 : 创建非核心线程执行任务 ;

用户调用 Executor 的 execute 执行任务 : 线程数量 CCC

  • 线程数 C=8C = 8C=8 , 任务队列没满 : 将任务放入任务队列 ;
  • 线程数 C=8C = 8C=8 , 任务队列已满 : 会报出异常 , 使用 Handler 处理错误 ;
/*** 创建自定义线程池 , 用于并行执行任务 .*/public static final Executor THREAD_POOL_EXECUTOR= new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory,new ThreadPoolExecutor.DiscardOldestPolicy());/*** 一个 Executor 执行者 , 以串行顺序 , 一次执行一个任务 ; 针对特定进行 , 该序列化是全局的 , * 即 一个进程只有一个该执行者 . */public static final Executor SERIAL_EXECUTOR = Utils.hasHoneycomb() ? new SerialExecutor() :Executors.newSingleThreadExecutor(sThreadFactory);@TargetApi(11)private static class SerialExecutor implements Executor {final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();Runnable mActive;public synchronized void execute(final Runnable r) {mTasks.offer(new Runnable() {public void run() {try {r.run();} finally {scheduleNext();}}});if (mActive == null) {scheduleNext();}}protected synchronized void scheduleNext() {if ((mActive = mTasks.poll()) != null) {THREAD_POOL_EXECUTOR.execute(mActive);}}}

【Android 异步操作】线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTask 使用线程池示例 )相关推荐

  1. 02 线程简介 多任务 多线程 普通方法调用和多线程 程序.进程.线程 Proces与Thread 核心概念

    线程简介 任务,进程,线程,多线程 多任务 多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务 多线程 原来是一条路,慢慢因为车太多了,道路堵塞,效率极低. 为了提高使用的 ...

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

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

  3. 线程的生命周期以及java提供的方法

    一.生命周期的五种状态 1.新建(new Thread) 当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动). 例如:Thread  t1=new Thread(); 2.就绪( ...

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

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

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

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

  6. 【Android 异步操作】线程池 ( 线程池 execute 方法源码解析 )

    文章目录 一.线程池 execute 方法源码解析 二.线程池 execute 方法完整源码及注释 一.线程池 execute 方法源码解析 进入 ThreadPoolExecutor 中 , 查看线 ...

  7. 【Android 异步操作】线程池 ( 线程池作用 | 线程池种类 | 线程池工作机制 | 线程池任务调度源码解析 )

    文章目录 一.线程池作用 二.线程池种类 三.线程池工作机制 四.线程池任务调度源码解析 一.线程池作用 线程池作用 : ① 避免创建线程 : 避免每次使用线程时 , 都需要 创建线程对象 ; ② 统 ...

  8. 《C#多线程编程实战(原书第2版)》——第3章 使用线程池 3.1 简介

    本节书摘来自华章出版社<C#多线程编程实战(原书第2版)>一书中的第3章,第3.1节,作者(美)易格恩·阿格佛温(Eugene Agafonov),黄博文 黄辉兰 译,更多章节内容可以访问 ...

  9. 线程池ThreadPoolExecutor使用简介

    2019独角兽企业重金招聘Python工程师标准>>> 一.简介  线程池类为 java.util.concurrent.ThreadPoolExecutor,常用构造方法为: Th ...

最新文章

  1. vant组件实现上传图片裁剪_如何用 120 行代码,实现交互完整的拖拽上传组件?...
  2. 波士顿动力机器狗要去切尔诺贝利上班了
  3. 数据库SQL语句学习笔记(6)-使用函数处理数据
  4. BZOJ 1845三角形面积并
  5. java -从小到大排序
  6. 新海诚动画背景简单娱乐分析
  7. java 反编译 报错_java反编译后再编译成class时提示缺少包
  8. Padavan老毛子固件玩法入门
  9. 基础篇:6)形位公差标注(GDT标准)-总章
  10. 五款免费pdf转换成word转换器软件下载
  11. win10共享其它计算机文件,两台win10间如何文件共享
  12. Java中100以内同时被3和5整除的数,输出
  13. 每日一佳——Hilbert Space Embeddings of Hidden Markov Models(Le Song,ICML,2010)
  14. 【论文汇总】 ECCV 2020 语义分割paper汇总
  15. 地理坐标系和投影坐标系详解(及坐标系在ArcGIS中的应用)
  16. 一线城市初次租房防坑指南
  17. 毕业设计 stm32单片机的目标检测与跟踪系统 -物联网 openmv 嵌入式
  18. 图集谷-写真集-爬虫-2.1
  19. 数据研发岗位常见面试题
  20. 终于收到黑客防线7月份样刊了

热门文章

  1. 浏览器根据什么来判定脚本失控?
  2. Oracle配置方面问题收集
  3. mysql 表查询注意
  4. BZOJ3709: [PA2014]Bohater
  5. java web--servlet(2)
  6. 计划程序:拒绝重复工作,让效率翻倍!
  7. Mysql存储过程中的事务回滚
  8. 动态sql语句输出参数
  9. c#设置软件开机自动运行,修改注册表
  10. WCF-Discovery的协议基础:WS-Disvovery(客户端驱动探测服务)