news 2026/9/20 22:50:29

AndroidUtilCode之ThreadUtils:新手也能秒懂的线程池使用简单指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AndroidUtilCode之ThreadUtils:新手也能秒懂的线程池使用简单指南

AndroidUtilCode之ThreadUtils:新手也能秒懂的线程池使用简单指南

【免费下载链接】AndroidUtilCode:fire: Android developers should collect the following utils(updating).项目地址: https://gitcode.com/gh_mirrors/an/AndroidUtilCode

AndroidUtilCode 是一款专为 Android 开发者打造的工具类库,其中的 ThreadUtils 是处理线程池和异步任务的明星工具类。它把复杂的线程池配置、任务调度、结果回调都封装成了"一行调用",新手不需要背诵ThreadPoolExecutor的参数含义,就能安全地执行后台任务、延时任务、周期任务和取消任务。

本文用通俗的比喻 + 少量示例,带你 3 分钟跑通 Android 线程池开发的全部常见场景 👇

为什么新手怕线程池?

自己用原生ThreadPoolExecutor创建线程池,你至少要回答这些问题:

  • 核心线程数写几?最大线程数写几?
  • 队列用无界还是有界?满了会怎样?
  • 任务出异常了谁兜底?结果怎么回到主线程更新界面?

答错任何一个,轻则任务被拒绝、重则 App 崩溃卡死。

而 ThreadUtils 的思路是:你只说"我要干什么",池子怎么选、参数怎么配、异常怎么兜底,它都替你做了

5种线程池怎么选:一张表看懂 🧭

ThreadUtils 内置了 5 种开箱即用的线程池,覆盖绝大多数场景:

线程池类型获取方法线程数策略适用场景
固定线程池getFixedPool(4)你指定几个就是几个业务明确的并发控制,如同时上传 4 张图
单线程池getSinglePool()永远只有 1 个线程必须按顺序执行的任务,如按序读写数据库
缓存线程池getCachedPool()按需创建,上限 128短生命周期、数量不定的任务
IO 密集型线程池getIoPool()2×CPU核数+1网络请求、文件读写等 IO 操作
CPU 密集型线程池getCpuPool()核心 CPU核数+1,上限 2×CPU核数+1图片压缩、加解密等纯计算任务

💡新手口诀:读写文件、发网络请求 → 选IO 池;算数据 → 选CPU 池;要排队执行 → 选单线程池;拿不准 → 选getFixedPool(2)先跑起来。

这些线程池都是全局单例复用的(见 ThreadUtils.java#L978-L996),同一个"类型 + 优先级"组合只创建一次,不会无限膨胀。

三步上手:写一个异步 Task

ThreadUtils 里所有任务都围绕Task抽象类展开(ThreadUtils.java#L1168-L1195),它只有 4 个必须实现的方法,职责非常清晰:

ThreadUtils.executeByIo(new ThreadUtils.SimpleTask<String>() { @Override public String doInBackground() throws Throwable { // 第 1 步:后台线程执行耗时操作(读写文件、请求网络) return FileIOUtils.readString4File(file); } @Override public void onSuccess(String result) { // 第 2 步:自动切回主线程,放心更新界面 tvContent.setText(result); } });

新手只需要记住两件事:

  1. doInBackground里只干耗时活,绝对不能碰控件;
  2. onSuccess自动回到主线程,可以直接操作 View——这是它比原生线程池最大的省心之处。

如果不想重写onFail/onCancel的日志打印,直接继承SimpleTask(ThreadUtils.java#L1154-L1166)即可,它会帮你把异常打印到 Log。

懒得分步写?也可以直接ThreadUtils.executeByIo(runnable)把普通Runnable丢进 IO 池,一行完成。

延迟执行与周期任务:一行参数搞定 ⏰

ThreadUtils 把"延时"和"周期"做成了同族方法,命名规律非常好记:

  • 立即执行executeByIo(task)
  • 延迟执行executeByIoWithDelay(task, 3, TimeUnit.SECONDS)—— 3 秒后再跑
  • 固定速率周期executeByIoAtFixRate(task, 1, TimeUnit.SECONDS)—— 每 1 秒重复一次
  • 先延迟再周期executeByIoAtFixRate(task, 5, 1, TimeUnit.SECONDS)—— 5 秒后开始,每 1 秒一次

五种池子(Fixed / Single / Cached / Io / CPU)各有一套对应方法,把方法名里的Io换成你选中的池子即可。官方测试用例 ThreadUtilsTest.java 覆盖了全部组合,照着抄就能跑。

任务取消与超时保护:防崩溃必备 🛡️

取消任务:任务对象随时可以调用cancel(),已排队的直接作废,正在执行的可被中断,回调会进入onCancel()(ThreadUtils.java#L865-L868):

ThreadUtils.cancel(myTask); // 取消单个任务 ThreadUtils.cancel(myPool); // 取消整个池子里的所有任务

超时保护:通过setTimeout给任务上"保险丝",超过指定毫秒数未完成就触发超时回调并中断线程(ThreadUtils.java#L1311-L1315):

myTask.setTimeout(5000, () -> Log.w("TAG", "请求超时,该给用户提示了"));

⚠️ 小贴士:周期任务(AtFixRate 系列)不支持超时保护,因为"每 1 秒执行一次"的任务天然没有"完成"概念。

ThreadUtils 在 AndroidUtilCode 中的位置

想深入源码?ThreadUtils 位于核心库utilcode模块,项目整体采用分层架构(lib 公共库层 → feature 功能层 → app 应用层):

常用入口文件清单:

  • 核心实现:ThreadUtils.java
  • 单元测试:ThreadUtilsTest.java
  • 功能库使用示例:feature/utilcode/pkg/
  • 库文档说明:lib/utilcode/README-CN.md

新手避坑清单 ✅

  1. 任务只能提交一次:同一个Task对象重复提交会被拦截(日志提示 "Task can only be executed once"),需要重复执行请 new 新的 Task;
  2. doInBackground 里别碰 UI:所有 View 操作统一放到onSuccess,它已在主线程;
  3. IO 密集别用 CPU 池:CPU 池线程数少,塞满 IO 任务会互相排队;
  4. 记得取消:页面销毁时调用cancel(task),避免回调时页面已关闭导致崩溃;
  5. 别忘加超时:网络类任务建议一律setTimeout,防止无网环境无限等待。

总结

AndroidUtilCode 的 ThreadUtils 用"选池子 → 写 Task → 三选一(立即/延时/周期)"的极简模型,把 Android 线程池开发中 90% 的样板代码都消化掉了。配合取消、超时两大保护机制,新手也能写出生产级的异步代码 🚀 建议把 ThreadUtilsTest.java 作为随身手册,遇到问题先找对应的测试用例对照,基本都能秒懂。

【免费下载链接】AndroidUtilCode:fire: Android developers should collect the following utils(updating).项目地址: https://gitcode.com/gh_mirrors/an/AndroidUtilCode

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 22:47:59

看完就会:AI论文写作软件测评与推荐全攻略

2026年真正好用的AI论文写作软件&#xff0c;核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测&#xff0c;千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队&#xff0c;覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …

作者头像 李华
网站建设 2026/9/20 22:47:33

OvWindowing 的 glfwInit 失败?让 Codex 走 TaoToken 对着 Device.cpp 查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 22:45:58

MI50 32G 跑大模型:Ubuntu 驱动安装与推理部署避坑指南

1. 为什么我选择 MI50 32G 来跑大模型1.1 一张被低估的“矿渣”计算卡MI50 这张卡在二手市场上的价格一直很魔幻。它是 AMD 在 2018 年前后推出的数据中心级加速卡&#xff0c;基于 Vega 20 核心&#xff0c;7nm 工艺&#xff0c;HBM2 显存&#xff0c;32G 版本的理论带宽能到 …

作者头像 李华
网站建设 2026/9/20 22:44:17

AI视频高光片段提取实战:从信号拆解到特征打分

从去年年底开始&#xff0c;我一直在折腾一个AI剪视频工具&#xff0c;核心目标很简单&#xff1a;给它一段完整的素材视频&#xff0c;它能自动把里面的“精彩”片段挑出来&#xff0c;拼成一个像样的短视频。做这个项目的过程中&#xff0c;最难回答的问题不是模型选型&#…

作者头像 李华