安卓面试题(16/30)线程池全解析

牛客高级系列专栏:

安卓(安卓系统开发也要掌握)


嵌入式


本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业安卓开发经验,该专栏整理本人对常见安卓高频开发面试题的理解;

网上安卓资料千千万,笔者将继续维护专栏,一杯奶茶价格不止提供答案解析,承诺提供专栏内容免费技术答疑,直接咨询即可。助您提高安卓面试准备效率,为您面试保驾护航!

正文开始⬇

安卓开发时很多时候会用到多线程技术,多线程的知识点本系列已经讲过AsyncTask、HandlerThread等,最后我们来看看线程池。面试官可能会问:

  1. 线程池的种类⭐⭐⭐⭐⭐
  2. 线程池的优点⭐⭐⭐⭐
  3. 平时当中使用案例⭐⭐⭐⭐
  4. 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发展已经很多年,安卓资料网上千千万,本专栏免费提供专栏内容技术答疑!!私聊当天必回。在阅读过程或者其他安卓学习过程有疑问,都非常欢迎私聊交流。

全部评论
码住,得空就学习
点赞 回复 分享
发布于 2022-12-28 16:35 陕西
收藏就代表学了
点赞 回复 分享
发布于 2022-12-28 16:44 浙江

相关推荐

02-11 12:20
门头沟学院 Java
面试中的青提很胆小:我不信有比我们学校更逆天的,计算机专业就业第一位是我们学校二餐厅的打印店
点赞 评论 收藏
分享
评论
11
17
分享

创作者周榜

更多
牛客网
牛客企业服务