线程调度与线程调度模型

任意时刻,只有一个线程占用 CPU,处于运行状态。而多线程并发执行就是轮流获取 CPU 执行权。

分时调用模型

轮流获取 CPU 执行权,均分 CPU 执行时间。

抢占式调度模型

优先级高的线程优先获取 CPU 执行权,这也是 JVM 采用的线程调度模型。

nice value

nice value 表示进程的优先级,nice value 越小,线程优先级越高。这个值是在 Process 类中定义的。默认的 THREAD_PRIORITY_DEFAULT,值为0.

nice value

下面来关注一下哪些异步框架如何设置这些 nice value 。

HanlderThread

HandlerThread 默认优先级

AsyncTask

AsyncTask默认优先级

cgroup(control group)

借鉴了 Linux ,它是更严格的群组调度策略,保证前台进程获取更多的 CPU。那些手动设置优先级比较低的线程或者不在前台运行的应用程序的线程会被放入后台 group ,后台 group 也是可以被 CPU 调度运行,只是获取 CPU 执行权的概率会比较低,这样就不会影响到前台group 的运行。

所以说需要设置要对应的 nice value ,因为该值会影响到线程获取 CPU 执行权的概率。

CPU 密集型与 IO 密集型

CPU 密集型

大量的计算,消耗CPU资源,例如视频进行高清解码,为了重复利用 CPU 资源,应该将线程数量设置为CPU的核心数+1。

IO 密集型

网络、磁盘IO,这时线程大多数时间是阻塞等待 IO 完成的,因为 IO 操作是不占用 CPU 的,为了提高线程的利用率,尽可能的创建更多的任务,这样 CPU 的效率就越高,但是这个数量是有限制的,不能无限制大,线程数 = 2*CPU 核心数。

多线程优化的注意点

线程具有继承性

在 UI 线程中如果创建子线程,那么该线程的优先级是和 UI 线程一样的,因此 UI 线程获取到 CPU 执行权的机率肯定会渐低。

根据任务的性质来设置线程数量,具体参考上面的 CPU 密集型和 IO 密集型的知识点。

Android 的异步方式

直接使用 Thread

这种方式是最简单的,但是也是最不推荐的方式,因为频繁的创建和销毁,增大了系统资源的开销,并且通过这种方式创建的线程无法得到控制,也不能被复用。

HandlerThread

内部结合了 Handler 和 Thread ,特点就是串行执行每一个任务。

IntentService

内部是使用 HandlerThread ,因此具备 HandlerThread 的特点,因为继承至 Service ,因此优先级比较高,不容易被系统杀死,它就相当于一个可以跑异步任务的 service 。

AsyncTask

内部提供了线程池,在异步任务执行前,执行中,执行完成都会相应的回调。

线程池

Executors 工具类提供了很多系统内置好的线程池,当然也可以通过自己去配置线程池的参数。

RxJava

可以通过任务的类型,选择 CPU 密集型的还是 IO 密集型的线程池去执行。

参考

本文是笔者学习之后的总结,方便日后查看学习,有任何不对的地方请指正。

记录于 2019年4月16号

android cpu调度策略_「性能优化3.0」Android线程调度异步方式汇总相关推荐

  1. 内存溢出案例_「性能优化」纳尼?内存又溢出了?是时候总结一波了

    写在前面 相信小伙伴们在平时工作的过程中,或多或少都会遇到一个场景:内存溢出.如果你没有遇到过这个场景,那就说明你是个假的程序员.哈哈,开个玩笑,平时工作过程中,我们确实会遇到这个问题.今天,我就将平 ...

  2. 「性能优化系列」APP内存优化理论与实践

    当一个应用同时运行越来越多的任务以及复杂的业务,Android系统的内存管理机制已经无法满足内存的释放与回收,为了应用的稳定性与性能,去控制内存的创建和回收就成为了一个重要的命题. 本篇文章主要涉及内 ...

  3. Android MediaScanner MediaProvider流程以及性能优化,音视频扫描

    Android MediaScanner MediaProvider流程以及性能优化,音视频扫描 快速扫描 一.源码解析 github链接 MediaScanner时序图 MediaSacannerR ...

  4. Android手机内存管理与性能优化

    Android手机内存管理与性能优化&JNI.NDK高级编程(JNI.Dalvik.内存监测) 课程分类:Android 适合人群:中级 课时数量:34小节课时 用到技术:Dalvik,DDM ...

  5. android edittext不可复制_精选Android中高级面试题:性能优化,JNI,设计模式

    性能优化 1.图片的三级缓存中,图片加载到内存中,如果内存快爆了,会发生什么?怎么处理? 参考回答:首先我们要清楚图片的三级缓存是如何的: 如果内存足够时不回收.内存不够时就回收软引用对象 2.内存中 ...

  6. android 重绘如何能不闪一下屏幕_前端性能优化之重绘和重排

    性能优化中,减少重绘重排应该是一种很好的优化方式,我们具体看一下什么情况下会造成重绘重排,为什么减少重绘重排可以做到优化,怎么样减少重绘重排. 浏览器渲染过程 我们先看看当浏览器拿到服务端返回的资源时 ...

  7. web 折线图大数据量拉取展示方案_【第2010期】QQ音乐Android客户端Web页面通用性能优化实践...

    前言 今日早读文章由QQ音乐客户端开发工程师@关岳分享,公号:云加社区(ID:QcloudCommunity,腾讯云官方开发者社区)授权分享. 正文从这开始~~ QQ音乐 Android 客户端的 W ...

  8. dll文件懒加载_前端性能优化

    # 前端性能优化 写在最前面:下面都是我对webpack的一些性能优化,想系统的学习性能优化方面的知识 推荐大家看看这本书 很系统 感觉面试也能如鱼得水 ## 构建优化 ### webpack优化 ( ...

  9. android cpu调度策略_ARM big.LITTLE大小核架构在Linux和Android内核下多核调度算法

    在2013年,big.LITTLE 家族又增加了新的SoC实现,有2个Cortex-A15+3个Cortex-A7核的ARM的参考测试芯片TC2,以及在三星Galaxy S4手机中应用的Samsung ...

最新文章

  1. 10个 Python 工程师,9个不合格!
  2. 一个架构师的缓存修炼之路
  3. R语言使用ggplot2包的快速可视化函数qplot绘制分组分组点图(带状图)实战
  4. Exchange Server 2010 全新部署篇九:CASHUB中客户端访问功能配置篇
  5. floor--朝负无穷大方向取整
  6. Question for recommendation system, which is a baseline
  7. 本周六与您相约 | 计算未来轻沙龙:让机器拥有理解语言的能力
  8. JavaWeb图书管理系统day01
  9. (转帖)对抽象编程:接口和抽象类
  10. Battlestation Operational HDU 6134
  11. 半监督学习的概述与思考,及其在联邦场景下的应用(续)
  12. 银河麒麟4安装MySQL8_银河麒麟4.0.2安装教程-电脑系统安装手册
  13. 令牌桶算法和漏桶算法python_限流之漏桶算法与令牌桶算法
  14. 最速下降法求解步骤及例题
  15. 安卓改机,改串的研究
  16. java 去除图片背景_java如何去除图片中的白色背景
  17. 千寻位置_SDK集成_Linux快速上手指南
  18. C语言编程练习---2021山东理工大学ACM 实验一J---X题解
  19. Python——数学运算函数
  20. 矢量网络分析仪VNA的校准之SOLT方法

热门文章

  1. python3多线程----锁机制
  2. C#创建MQTT客户端接收服务器信息
  3. 赛码浪潮笔试题库软件实施岗位_赛码 -HRTechChina中国人力资源科技-向上的力量!...
  4. osg prebuild 准备好开发工具
  5. 高分辨率、实时的手持物体360°三维模型重建结构光技术
  6. 15个目标检测开源数据集汇总
  7. git 生成公钥,并且配置
  8. 如何创建一个定时管理的页面
  9. Python脚本:将mol2分子库文件拆分为单个mol2文件
  10. 「杂谈」如何写好R语言apply家族函数