Android 中的线程池
为什么使用线程池?
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
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:工作队列,用于任务的存放
运行流程
- 线程池创建的时候里面不会有任何线程
- 如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务;
- 如果正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入队列;
- 如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么还是要创建非核心线程立刻运行这个任务;
- 如果队列满了,而且正在运行的线程数量大于或等于 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 创建的。
这个知识点比较复杂大家可以参考其他博客
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
16.源码阅读(View的绘制-android api-26)
今天带着一个问题来看Android View的绘制流程 View的绘制入口在哪? 很多时候,在进入到一个页面的时候,会需要动态的获取到布局中某一个view的宽度或者高度,但是我们发现如果直接在onCreate方法或者onResume方法中通过这种方式去取高度值得到的是0 int measuredHeight = mTextView.getMeasuredHeight(); 而调用post方法才可以得到正确的值 mTextView.post(new Runnable() { @Override public void run() { int measuredHeight1 = mTextView.getMeasuredHeight(); System.out.println("post measuredHeight:"+measuredHeight1); } }); 所以回到我们的第一个问题,view的绘制入口在哪里,只有view绘制完成经过测量才能得到宽高值,是否在onCreate和onResume方法中,view还没有完成绘制测量呢? 在Activity的启动流程中已经了解到,最终要...
- 下一篇
iOS快速清除全部的消息推送
前言 越来越多的应用,请求用户推送权限,一般情况下,普通应用我是不允许的,除了通讯应用、支付宝(银行app有很多不羊毛的活动推送,不允许)、GTD(Things、Due)、健身(Kepp、SixPack),其它的像淘宝天猫、京东,每次打开app,都要反复问我还要不要打开推送,你们就不能先调查一下我用的iOS系统多久吗?请问一个用了4年以上的用户,如果他还想打你们家的app推送,难道不知道在那里开吗?脑子进水吧。 iOS10 以上 如果是iOS10以上,并且是iPhone 6S、iPhone 6S plus ,就可以利用3D Touch一键清除通知。 IMG_C28272FF6B00-1.jpeg 如果是点击推送的 x ,就会出现 Clear,点击后会清除当前区的推送 IMG_24407F30BCFE-1.jpeg 如果长压(3D Touch),就出现 Clear All Notifications,点击就会清楚全部的推送 IMG_2184A87A7C29-1.jpeg iOS 9 如果是iOS 9 和更老的机型,首先按住锁屏上方的把手把通知中心拉下来,拖到底,松手,然后再向上把它拖回去...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- 设置Eclipse缩进为4个空格,增强代码规范
- Mario游戏-低调大师作品
- MySQL8.0.19开启GTID主从同步CentOS8
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS8编译安装MySQL8.0.19
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Redis,开启缓存,提高访问速度