在Android开发中,对于高并发的场景,通常需要用到java.util.concurrent包下的线程池,线程池有以下优点:
- 重用线程池中的线程,避免因为线程的创建和销毁带来性能开销;
- 有效控制线程池的最大并发数,避免大量线程之间因相互抢占系统资源而导致的阻塞现象;
- 能够对线程进行管理,并提供定时执行及定间隔循环执行等功能。
在Java的java.util.concurrent包下的Executor接口是task执行的顶级接口,ThreadPoolExecutor是线程池的真正实现类,ScheduledThreadPoolExecutor继承了ThreadPoolExecutor是线程池的真正实现类,并在ThreadPoolExecutor的基础上添加了对执行周期性任务的支持。concurrent包内,将常用的调用方式进行了封装,放在Executors类中,因此我们通常可以调用Executors类中的方法来实现常规场景下的线程池的调用。
四种最常用的线程池的对比如下:
| 类型 | 创建方法 | 说明 |
|---|---|---|
| FixThreadPool | Executors.newFiedThreadPool(int nThreads) | 一种线程数量固定的线程池,只有核心线程并且不会被回收,没有超时机制 |
| CachedThreadPool | Executors.newCachedThreadPool() | 一种线程数量不定的线程池,只有非核心线程,当线程都处于活动状态时,会创建新线程来处理新任务,否则会利用空闲的线程,超时时长为60s |
| ScheduledThreadPool | Executors.newScheduledThreadPool(int corePoolSize) | 核心线程数是固定的,非核心线程数没有限制,非核心线程闲置时立刻回收,主要用于执行定时任务和固定周期的重复任务 |
| SingleThreadExecutor | Executors.newSingleThreadExecutor() | 只有一个核心线程,确保所有任务在同一线程中按顺序执行 |
相关类的UML图如下