Android 线程池总结

Android 线程池总结 在 Android 开发中线程池是保证应用性能、避免 ANR应用无响应和内存泄漏OOM的重要手段。相比于频繁创建和销毁new Thread线程池能够复用线程、限制并发数量并统一管理。Android 中的线程池概念源自 Java 的Executor其真正的实现类是ThreadPoolExecutor。以下是关于 Android 线程池的全面解析一、 核心参数与工作原理创建自定义线程池ThreadPoolExecutor时需要配置以下核心参数它们决定了线程池的运行逻辑核心线程数 (corePoolSize)线程池中常驻的核心线程数量默认情况下即使闲置也不会被回收。最大线程数 (maximumPoolSize)线程池允许创建的最大线程数量。当任务队列满且当前线程数小于此值时会创建非核心线程。存活时间 (keepAliveTime)非核心线程闲置时的超时时长超过该时间将被回收。时间单位 (unit)存活时间的单位如秒、毫秒。任务队列 (workQueue)用于存储已提交但尚未执行的任务。当核心线程都在忙时新任务会进入此队列排队。线程工厂 (threadFactory)用于创建新线程通常使用默认工厂即可。拒绝策略 (rejectedExecutionHandler)当线程池和队列都满时对新任务的处理策略如抛出异常、由调用者线程执行、丢弃任务等。执行规则当提交新任务时若当前线程数 核心线程数则直接创建核心线程执行若 核心线程数则尝试加入任务队列若队列已满且当前线程数 最大线程数则创建非核心线程执行若均不满足则触发拒绝策略。二、 常见的四种内置线程池Java 内置了四种便捷的线程池工厂方法它们本质上都是通过配置不同的ThreadPoolExecutor参数来实现的固定长度线程池 (FixedThreadPool)特点只有核心线程数量固定空闲时不会被回收。任务队列无大小限制。适用场景控制最大并发线程数适合任务量固定且耗时较长的场景。可缓存线程池 (CachedThreadPool)特点只有非核心线程线程数量无上限。空闲线程超过 60 秒会被回收无可用线程时立即创建新线程。适用场景执行大量耗时较少的短时异步任务。风险任务过多时会无限创建线程极易导致 OOM。单线程执行器 (SingleThreadExecutor)特点只有一个核心线程任务按提交顺序排队执行无需处理线程同步问题。适用场景必须按顺序执行的任务如写文件、写数据库等。调度线程池 (ScheduledThreadPool)特点核心线程数固定非核心线程数无限制且空闲即回收。内部使用延时队列对任务排序。适用场景执行定时任务或具有固定周期的重复任务。三、 实战如何根据场景自定义线程池在实际面试或项目中通常推荐使用ThreadPoolExecutor自定义线程池以便灵活控制风险。IO 密集型任务如网络请求、文件读写由于 IO 操作等待时不占用 CPU可适当增加线程数。建议corePoolSize设为2 * CPU核心数maximumPoolSize设为3 * CPU核心数并使用有界队列如ArrayBlockingQueue防止内存溢出。CPU 密集型任务如图片解码、复杂计算过多线程会导致频繁的上下文切换反而降低性能。建议corePoolSize设为CPU核心数 1maximumPoolSize与核心线程数保持一致快速回收空闲线程。四、 安全使用线程池的注意事项避免 UI 更新在子线程耗时任务执行完毕后必须通过runOnUiThread、Handler或LiveData等机制切换回主线程更新 UI。结合生命周期管理在 Activity 或 Fragment 销毁时onDestroy务必调用executor.shutdownNow()关闭线程池防止后台任务持有外部引用导致内存泄漏。拒绝使用无界队列尽量使用有界队列防止任务无限堆积引发 OOM。现代替代方案在较新的 Android 开发中推荐结合生命周期感知组件使用ViewModelLiveData、RxJava或Kotlin 协程 (Coroutine)来管理异步任务它们底层也封装了线程池但使用更安全便捷。