安卓面试题(16/30)线程池全解析
牛客高级系列专栏:
安卓(安卓系统开发也要掌握)
- 想通关安卓面试,请看(承诺免费售后答疑):《150道安卓高频面试题目录及答案链接》
- 想通关安卓系统面试,请看:《140道安卓系统Framework面试题目录及答案链接》
- 想进阶安卓开发,请看(承诺免费售后答疑):《Android进阶知识体系解析_15大安卓进阶必备知识点》
- 想了解安卓APP完整开发流程,请看(承诺免费售后答疑):《安卓APP完整开发流程》
- 想掌握安卓App性能优化,请看(承诺免费售后答疑):《安卓性能优化讲解和实战专栏》
- 想掌握Gradle语法和配置,制作Gradle插件,请看(承诺免费售后答疑):《安卓Gradle语法解析和实践大全》
嵌入式
- 想通关嵌入式面试,请看: 《111道嵌入式面试题目录及答案链接》
- 想多掌握几个嵌入式项目,请看:《6个嵌入式项目交流分享(附源码)》
本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业安卓开发经验,该专栏整理本人对常见安卓高频开发面试题的理解;
网上安卓资料千千万,笔者将继续维护专栏,一杯奶茶价格不止提供答案解析,承诺提供专栏内容免费技术答疑,直接咨询即可。助您提高安卓面试准备效率,为您面试保驾护航!
正文开始⬇
安卓开发时很多时候会用到多线程技术,多线程的知识点本系列已经讲过AsyncTask、HandlerThread等,最后我们来看看线程池。面试官可能会问:
- 线程池的种类⭐⭐⭐⭐⭐
- 线程池的优点⭐⭐⭐⭐
- 平时当中使用案例⭐⭐⭐⭐
- ThreadPoolExecutor类有了解吗?⭐⭐(需掌握,但一般不会提问)
看完以下的解析,一定可以让面试官眼前一亮。
目录
- 1、为何要使用线程池,有何优点
- 2、ThreadPoolExecutor
- 2.1 构造函数
- 2.2 线程池工作原理
- 3、线程池的种类和特点
- 3.1 FixThreadPool
- 3.2 SingleThreadPool
- 3.3 CachedThreadPool
- 3.4 ScheduledThreadPool
- 总结
- 4、实际使用案例
1、为何要使用线程池,有何优点
平时的安卓开发中,很多耗时操作不能在主线程中执行,不然就会阻塞主线程,因此我们常见的做法是new 一个Thread来执行耗时操作,最后通过Handler切换到主线程来修改UI。然而当线程数量多的时候,有可能会导致死机和OOM。在安卓中,我们可以使用线程池来管理我们所创建的线程。所谓线程池就是事先创建一系列线程,把它们放在一个容器里,使用的时候直接从池子里拿线程,而不需要重新去new一个。我们先讨论线程池的优点:
- 多个线程可以多次复用,避免因线程频繁创建和销毁给系统带来的损耗,同时也可以提高系统响应速度,当任务需要执行时不需要创建新的线程就可以执行;
- 线程池的最大并发数可控制,避免大量的线程之间因互相抢占系统资源而导致的阻塞现象;
- 能够对线程进行管理,并提供定时执行以及定间隔循环执行等功能;
2、ThreadPoolExecutor
2.1 构造函数
待会会讲的4种线程池都是通过ThreadPoolExecutor来创建的,因此需要先了解ThreadPoolExecutor:
// 构造函数
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
// 使用demo
// 创建线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 1000, TimeUnit.SECONDS, new LinkedBlockingQueue<>()), new ThreadPoolExecutor.AbortPolicy());
// 通过循环向线程池中添加10个任务
for (int i = 0; i < 10; i++) {
executor.execute(() -> {
// do something
});
}
// 关闭线程池
executor.shutdown();
先看看构造函数的各个参数:
- corePoolSize:线程池的核心线程数量。核心线程当该线程处于闲置时间也不会回收的线程。当然,我们可以执行threadPoolExecutor.allowCoreThreadTimeOut(true)后,当闲置的核心线程的等待新任务时间超过了keepAliveTime也会被终止;
- maximumPoolSize:线程池最大线程数,等于核心线程 + 非核心线程。如果运行的线程总数量超过这个数值,那么接下里新来的任务都会阻塞等待;
- keepAliveTime:闲置的非核心线程等待时间超过keepAliveTime设定的时间就会被回收,而核心线程需要执行threadPoolExecutor.allowCoreThreadTimeOut(true)后超过时间才会被回收;
- unit:keepAliveTime的单位:
单位 | 含义 |
---|---|
TimeUnit.DAYS | 天 |
TimeUnit.HOURS | 时 |
TimeUnit.MINUTES | 分 |
TimeUnit.MILLISECONDS | 毫秒 |
TimeUnit.MICROSECONDS | 微秒 |
TimeUnit.NANOSECONDS | 纳秒 |
- workQueue:这就是我们执行execute()添加的任务所存放的工作阻塞队列,有以下选项: 阻塞队列 | 说明 | | ----- | ----- | | ArrayBlockingQueue | 基于数组实现的有界的阻塞队列,该队列按照FIFO(先进先出)原则对队列中的元素进行排序。 | | LinkedBlockingQueue | 基于链表实现的阻塞队列,该队列按照FIFO(先进先出)原则对队列中的元素进行排序。 | | SynchronousQueue | 内部没有任何容量的阻塞队列。在它内部没有任何的缓存空间。对于SynchronousQueue中的数据元素只有当我们试着取走的时候才可能存在。 | | PriorityBlockin
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
Android高频面试题全解析 文章被收录于专栏
#提供免费售后答疑!!花一杯奶茶的钱获得安卓面试答疑服务,稳赚不赔# Android发展已经很多年,安卓资料网上千千万,本专栏免费提供专栏内容技术答疑!!私聊当天必回。在阅读过程或者其他安卓学习过程有疑问,都非常欢迎私聊交流。