在Android开发中,线程池(ThreadPoolExecutor)是管理多线程任务的核心工具,能有效优化资源消耗、避免频繁创建/销毁线程的开销。以下是详细使用方法和注意事项:
1. 线程池的创建
- 固定线程池(FixedThreadPool):核心线程数与最大线程数相同,适合CPU密集型任务。
java
ExecutorService fixedPool = Executors.newFixedThreadPool(4);
- 缓存线程池(CachedThreadPool):线程数随任务量动态调整,适合短时异步任务。
java
ExecutorService cachedPool = Executors.newCachedThreadPool();
- 单线程池(SingleThreadExecutor):保证任务按顺序执行,类似Handler的串行效果。
java
ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();
2. 自定义ThreadPoolExecutor
通过构造函数可精细控制参数:
java
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2, // 核心线程数
10, // 最大线程数
60, // 空闲线程存活时间(秒)
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(100), // 任务队列
new ThreadFactory() { // 自定义线程创建
@Override public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setName("Custom-Thread");
return t;
}
},
new RejectedExecutionHandler() { // 拒绝策略
@Override public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
Log.e("TAG", "任务被拒绝");
}
}
);
3. 关键参数说明
- 核心/最大线程数:根据任务类型(CPU/IO密集型)调整。
- 任务队列:`ArrayBlockingQueue`(有界)、`LinkedBlockingQueue`(无界)等。
- 拒绝策略:包括默认抛出异常(AbortPolicy)、丢弃任务(DiscardPolicy)等。
4. 扩展知识点
- Android特有线程池:AsyncTask底层使用`SerialExecutor`(API 30已废弃),推荐改用`ThreadPoolExecutor`。
- 与HandlerThread对比:HandlerThread适用于需要Looper的场景(如定时任务),线程池适合并发处理。
- 内存泄露风险:持有Activity引用时需在`onDestroy()`中调用`shutdownNow()`。
5. 最佳实践
- 避免在循环中频繁提交任务,优先批量执行。
- IO密集型任务可增大线程数(如核心数×2)。
- 使用`Future`获取异步结果时注意阻塞超时设置。
6. 线程池监控
可通过重写`beforeExecute()`和`afterExecute()`方法统计任务执行时间,或通过`getPoolSize()`等方法获取运行时状态。