- 5.重用线程池中的线程,避免因为线程的创建和销毁所带来的性能开销
- 能有效的控制线程池的最大并发数,避免大量的线程之间因互相抢占系统资源而导致的阻塞现象
Android中的线程池的概念源自于Java中的Executor,它是一个接口,真正的线程池的实现是ThreadPoolExecutor。ThreadPoolExecutor提供了一系列参数来配置线程池。
ThreadPoolExecutor
- 在使用execute()方法提交一个Runnable对象时
- 会先判断当前线程池中的线程数是否小于corePoolSize
- 如果小于,则创建新线程并执行Runnable
- 如果大于等于,则尝试将Runnable加入到workQueue中
- 如果workQueue没满,则将Runnable正常入队,等待执行
- 如果workQueue满了,则会入队失败,那么会尝试继续增加线程
- 如果当前线程池中的线程数是否小于maximumPoolSize
- 如果小于,则创建新线程并执行任务
- 如果大于等于,则执行拒绝策略,拒绝此Runnable
Android中的四种线程池
FixedThreadPool
特点:一种线程数量固定的线程池,当线程处于空闲状态时,它们并不会被回收 优点:因为只有核心线程并且不会被回收,适合处理需要快速响应外界请求的场景
CachedThreadPool
特点:线程数量不定的线程池,没有核心线程数,所有任务都能过得到立即执行。 使用场景:适合处理大量的耗时较少的任务
ScheduledThreadPool
特点:一种核心线程数量固定,而非核心线程数没有限制的,非核心线程闲置时会立即回收,超时时间为0 适用场景:执行定时任务和具有周期的重复任务。
SingleThreadExecutor
特点:只有一个线程的线程池,确保所有的任务同一个线程中执行 适用场景:这些任务有强相关性,使得不需要处理线程的同步问题,多线程-》单线程