Android多线程
1、线程是什么?
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
2、为什么要使用多线程?
避免阻塞、避免CPU空转、提升性能
并且针对于Android手机来说:主线程是不能执行耗时操作的(包括网络请求、下载等操作)、否则就会出现ANR(Application Not Responding)。
3、Android中多线程
1、extends Thread or implements runable
最常用的一种多线程方式。
使用:
2、implements Callable
比较少见的一种方式。
使用:
3、匿名线程
最简单的使用。
4、AsyncTask
AsyncTask是Android自带的一种自定义的多线程任务类,让多线程任务变得简单。
AsyncTask包括线程使用前的配置,线程进行中的任务执行,进行中的任务进度反馈,任务完成后返回结果,都可以进行自定义。
使用:
5、线程池
除非是大型的应用,否则很少使用。
线程池的好处:
1:对多个线程进行统一地管理,避免资源竞争中出现的问题。
2:(重点):对线程进行复用,线程在执行完任务后不会立刻销毁,而会等待另外的任务,这样就不会频繁地创建、销毁线程和调用GC。
常用的线程池:
1:ThreadPoolExecutor 创建基本线程池
创建线程池:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory) {
...
}
参数说明:
corePoolSize: 该线程池中核心线程的数量。
maximumPoolSize:该线程池中最大线程数量。
keepAliveTime:非核心线程空闲时要等待下一个任务到来的时间,当任务很多,每个任务执行时间很短的情况下调大该值有助于提高线程利用率。
unit:上面时间属性的单位。
workQueue:阻塞任务队列,当核心线程都被占用时,将任务放入阻塞队列。
threadFactory:线程工厂,可用于设置线程名字等等,一般无须设置该参数。
使用:
执行逻辑:
1.execute一个线程之后,如果线程池中的线程数未达到核心线程数,则会立马启用一个核心线程去执行。
2.execute一个线程之后,如果线程池中的线程数已经达到核心线程数,且workQueue未满,则将新线程放入workQueue中等待执行。
3.execute一个线程之后,如果线程池中的线程数已经达到核心线程数但未超过非核心线程数,且workQueue已满,则开启一个非核心线程来执行任务。
4.execute一个线程之后,如果线程池中的线程数已经超过非核心线程数,则拒绝执行该任务,采取饱和策略,并抛出RejectedExecutionException异常。
2:FixedThreadPool (可重用固定线程数)
特点:参数为核心线程数,只有核心线程,无非核心线程,并且阻塞队列无界。
3:CachedThreadPool (按需创建)
特点:没有核心线程,只有非核心线程,并且每个非核心线程空闲等待的时间为60s,采用SynchronousQueue队列。
4:SingleThreadPool(单个核线的fixed)
5:ScheduledThreadPool(定时延时执行)
6:自定义的PriorityThreadPool(队列中有优先级比较的线程池)