Android的线程池

937 阅读2分钟

Android中的线程池的概念来源于Java中的Executor,Executor是一个接口,真真的线程池的实现为ThreadPoolExecutor。ThreadPoolExecutor提供了一系列参数来配置线程池。Android的线程池主要分为4类。

一、线程池的优点:

  1. 重用线程池中的线程。
  2. 能有效控制线程池的最大并发数,避免大量的线程之间因相互抢占资源而导致阻塞的现象。
  3. 能够对线程进行简单的管理,并提供定时执行以指定间隔循环执行等功能。

二、Android主要的四类线程池

1.FixThreadPool

它是一种线程数量固定的线程池,当线程处于空闲状态时,它们并不会被回收,除非线程池被关闭了。


ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);

2.CachedThreadPool

它是一种线程数量不定的线程池,它只有非核心线程,并且其最大线程数为Integer.MAX_VALUE。


ExecutorService cachedThreadPool = Executors.newCachedThreadPool(5);

3.ScheduledThreadPool

它的核心线程数是固定的,而非核心数是没有限制的,并且当非核心线程闲置时会立即被回收。


ExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);

4.SingleThreadExecutor

这类线程内部只有一个核心线程,它确保所有的任务都在同一个线程中按顺序执行。


ExecutorService fixedThreadPool = Executors.newSingleThreadExecutor();

三、核心线程

核心线程会在线程中一直存活,即使它们都处于闲置状态。

四、非核心线程

非核心线程闲置时间超时就会被回收。

五、ThreadPoolExecutor遵守的规则

  1. 如果线程池中的线程数未达到核心线程数量,那么会直接启动一个核心线程来执行任务。
  2. 如果线程池中的线程数量已达到或者超过核心线程数量,那么任务会被插入到任务队列中排队等待执行。
  3. 如果无法将任务插入到队列中,这往往是由于队列已满,这时如果线程数还未达到线程池规定的最大值,那么会立刻启动一个非核心线程来执行任务。
  4. 如果线程数量已经达到线程池规定的最大值,那么就拒绝执行此任务。