1.Android中的线程
在操作系统中,线程是操作系统能够调度的最小单元,同时线程又是一种受限的系统资源,即线程不能无限制的产生,并且线程的创建和销毁都会有相应的开销。线程在Android开发的过程中是一个很重要的概念,从用途上区分大概可以分为两种主线程和子线程。主线程是指进程所拥有的线程,在Java中默认一个进程只有一个线程,而这个线程就是主线程,主线程又被称为UI线程主要处理界面相关的事情,因为用户会随时和界面进行交互,因此主线程在任何时候都必须保持着较高的响应速度,否则就会产生一种界面卡顿的感觉,甚至主线程阻塞5秒系统就会显示ANR对话框提示用户对应的应用处于无响应状态。而子线程又被称作工作线程,往往用于一些耗时的操作,除了主线程之外的都是子线程。
2.Android中的线程池
线程池的基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。Android中的线程池的概念来源于Java中的Executor,在Java中Executor是一个接口,线程池的真正实现为ThreadPoolExecutor,ThreadPoolExecutor提供了一系列的参数来配置线程池,通过传入不同的参数就可以得到不同作用的线程池。在代码中使用线程池进行优化,可以重用线程池中的线程,避免因为频繁的创建和销毁线程带来的性能上的损耗,同时线程池还能控制程序线程的最大并发数,避免因大量的线程之间相互争抢资源而导致阻塞的现象,线程池还能够对线程进行简单的管理,并提供定时执行以及指定时间间隔进行循环执行等功能。
3.线程池的使用
Android的线程池主要分为4类,分别为FixedThreadPool、CachedThreadPool、ScheduledThreadPool和SingleThreadExecutor,这4类线程池可以通过Executors所提供的工厂方法来得到,由于Android中的线程池都是直接或者间接的通过配置ThreadPoolExecutor来实现的,因此需要先了解ThreadPoolExecutor。
(1)ThreadPoolExecutor
ThreadPoolExecutor有四个重载方法,在这里主要介绍参数最多的那个构造方法,这样就可以知道其它方法参数的含义了。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
这里的构造方法有7个参数,接下来我们来看看这7个参数的含义:
- corePoolSize:线程池中核心线程的数量
- maximumPoolSize:线程池中最大线程数量
- keepAliveTime:非核心线程的超时时长,当系统中非核心线程闲置时间超过keepAliveTime之后,则会被回收。如果ThreadPoolExecutor的allowCoreThreadTimeOut属性设置为true,则该参数也表示核心线程的超时时长
- unit:表示keepAliveTime参数的单位,有纳秒、微秒、毫秒、秒、分、时、天等
- workQueue:线程池中的任务队列,该队列主要用来存储已经被提交但是尚未执行的任务,存储在这里的任务是由ThreadPoolExecutor的execute方法提交来的
- threadFactory:为线程池提供创建新线程的功能,这个我们一般使用默认即可
- handler:拒绝策略,当线程无法执行新任务时(一般是由于线程池中的线程数量已经达到最大数或者线程池关闭导致的),默认情况下,当线程池无法处理新线程时,会抛出一个RejectedExecutionException
对于线程中的任务队列来说,workQueue是一个BlockingQueue的类型,那么这个BlockingQueue又是什么呢?它是一个特殊的队列,当我们从BlockingQueue中取数据时,如果BlockingQ