ExecutorService(线程池)+线程

来源:互联网 发布:外汇 交易系统测试软件 编辑:程序博客网 时间:2024/05/01 15:29

Android中的线程形态,除了传统的Thread外,还包含AsyncTask、HandlerThread、IntentService,这三者底层也是使用线程实现的。

AsyncTask

AsyncTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后把任务的进度和执行结果传递给主线程,并在主线程中更新UI。从实现上来说,AsyncTask封装了Thread 和 Handler,通过AsyncTask可以更加方便地执行后台任务以及在主线程中更新UI。但是AsyncTask并不适合进行特别耗时的后台任务,耗时的后台任务,建议使用线程池。

public abstract class AsyncTask<Params, Progress, Result> 

Params表示参数的类型, Progress表示后台任务执行进度的类型, Result表示后台任务返回结果的类型。如果AsyncTask不需要传递参数,这三个参数可以用Void表示。

AsyncTask提供了四个核心方法:

protected void onPreExecute()protected abstract Result doInBackground(Params... var1);protected void onProgressUpdate(Progress... values)protected void onPostExecute(Result result)

onPreExecute(),在主线程中执行,一般用于做一些准备工作。
doInBackground(),在线程池中执行,用于执行异步任务,可以通过publishProgress方法来更新任务的进度,publishProgress会调用onProgressUpdate方法。
onProgressUpdate(),在主线程中执行。
onPostExecute(),在主线程中执行,异步任务执行后,此方法被调用。

在Android 1.6之前,AsyncTask是串行执行任务的,Android 1.6的时候AsyncTask开始采用线程池处理并行任务,但是从Android 3.0开始,为了避免AsyncTask带来的并发错误,AsyncTask又采用一个线程串行执行任务。但可以通过AsyncTask的executeOnExecutor方法来并行地执行任务。

Android中的线程池

Android中的线程池的概念来源于Java中的Executor,Executor是一个接口,真正的实现为ThreadPoolExecutor。ThreadPoolExecutor提供了一系列参数来配置线程池,通过不同的参数可以创建不同的线程池。

ThreadPoolExecutor常用的构造方法:

public ThreadPoolExecutor(int corePoolSize,                         int maximumPoolSize,                         long keepAliveTime,                         TimeUnit unit,                         BlockingQueue<Runnable> workQueue,                        ThreadFactory threadFactory)

corePoolSize: 核心线程数。
maximumPoolSize: 线程池所能容纳的最大线程数。
keepAliveTime: 非核心线程闲置时的超时时长,超过这个时长,非核心线程就会被回收。
workQueue: 线程池中的任务队列,通过线程池中的execute()方法提交的runnable对象会存储在这个参数中。

Android中最常见的四类具有不同功能特性的线程池:
FixedThreadPoolCachedThreadPoolScheduledThreadPoolSingleThreadExecutor

FixedThreadPool: 它是一种线程数量固定的线程池,只有核心线程,并且没有超时机制。
CachedThreadPool: 只有非核心线程,并且其最大线程数为Integer.MAX_VALUE。
ScheduledThreadPool: 它的核心线程数量是固定的,非核心线程数量是没有限制的,主要用于执行定时任务和具有固定周期的重复任务。
SingleThreadExecutor: 内部只有一个核心线程。

四种线程池的典型使用:

Runnable runnable = new Runnable() { @Override    public void run() {        SystemClock.sleep(2000);    }};ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);fixedThreadPool.execute(runnable);ExecutorService cachedThreadPool = Executors.newCachedThreadPool();cachedThreadPool.execute(runnable);ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);//2000ms后执行runnablescheduledThreadPool.schedule(runnable, 2000, TimeUnit.MILLISECONDS);//延迟10ms后,每隔1000ms执行一次runnablescheduledThreadPool.scheduleAtFixedRate(runnable, 10, 1000, TimeUnit.MILLISECONDS);ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();singleThreadExecutor.execute(runnable);
0 0
原创粉丝点击