您的位置:首页 > 移动开发 > Android开发

Android的线程和线程池

2016-06-06 22:59 471 查看

一、AsyncTask的初始

AsyncTask是一种在后台执行任务然后将最新的进度和最后结果更新到UI线程的工具类。AsyncTask包含四个核心方法分别是:

onPreExecute() 在UI线程中、异步任务执行前调用。

doInBackground(Params… params) 在线程池中执行,用于执行异步任务,此方法通过publishProgress来更新进度

onProgressUpdate(Progress… values) 在UI线程中执行用于更新进度

onPostExecute(Result result) 异步任务完成后执行,在UI线程中执行

二、AsyncTask的限制条件:

1、必须在UI线程中进行初始

2、execute方法必须在UI线程中调用

3、AsyncTask在1.6以前是串行执行、在1.6到3.0是并行、3.0以后又是串行但可以通过exectuteOnExecutor来并行执行。

三、AsyncTask的工作原理

在新建AyncTaks对象的时建立如下对象:

public AsyncTask() {
mWorker = new WorkerRunnable<Params, Result>() {
public Result call() throws Exception {
mTaskInvoked.set(true);
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
//noinspection unchecked
return postResult(doInBackground(mParams));
}
};

mFuture = new FutureTask<Result>(mWorker) {
@Override
protected void done() {
try {
postResultIfNotInvoked(get());
} catch (InterruptedException e) {
android.util.Log.w(LOG_TAG, e);
} catch (ExecutionException e) {
throw new RuntimeException("An error occured while executing doInBackground()",
e.getCause());
} catch (CancellationException e) {
postResultIfNotInvoked(null);
}
}
};
}


当自定义的Task(如:DownLoadTask)执行execute方法时回调用executeOnExecutor()方法。在它的内部把它加入到SerialExector线程池。SerialExecutor线程池串行的每次只能执行一次。当真正执行时会调用THREAD_POOL_EXECUTOR来真正的执行。在执行中实际上执行的是mWorker 。在mWorker中回调用doInBackground(),会调用postResult方法。在postResult方法中会发送message 到UI线程执行最后的onPostExecute方法

四、HandlerThread

HandlerThread是一个内部开启了消息队列循环的Thread。

五、IntentService

IntentService是一个继承与Service的抽象类。它包含抽象方法handlerIntent();IntentService在onCreate时会新建一个HandlerThread用于无限的消息循环,同时还会新建内部类ServiceHandler.当启动Service时会通过ServiceHanlder的实例对象发送一个消息到HandlerThread。当HandlerThread接收到消息时就会调用handleIntent进行执行。当执行完毕后就会自动的停止服务。所以IntentService用于需要提高代码的优先级同时执行完毕后会自我停止的的情景。

六、Android中的线程池

Android中的线程池有以下优点:

1、可以重用线程池中的线程,避免新建和销毁带来的开销

2、可以避免大量的线程同时涌入照成线程拥堵。

3、方便管理线程。比如间隔执行。

七、ThreadPoolExecutor

Executor是一个代表线程池的接口。ThreadPoolExecutor是它的实现。新建一个ThreadPoolExecutor需要如下实例:

1、corePoolSize 表示核心线程的个数。一般情况下会一直存在

2、maximumPoolSize 表示非核心线程个数.当超过keepAliveTime时会被销毁

3、keepAliveTime 过期时间

4、unit 过期时间单位

5、workQueue 工作队列

6、threadFactory 线程工厂

ThreadPoolExecutor的线程的产生和销毁执行如下规律:

1、若核心线程为到达最大时,会启用核心线程

2、当workQueue未满但核心线程已到最大值时,会加入workQueue并阻塞

3、当workQueue已满则启动非核心线程

4、当非核心线程已满则抛出RejectExecutionException异常

所以综上所述:corePool–>workQueue–>maxiMumPool–>rejectedExecution

八、线程池的分类

通过Executors来创建。

1、FixedThreadPool 只有核心线程,没有非核心线程。所以线程池不会被回收,当所有核心线程都在执行时会出现等待。

2、CachedThreadPool 无核心线程、只有非核心线程,无缓存队列。当线程池都在执行时会创建新的线程并立即执行

3、ScheduledThreadPool 核心线程固定、非核心线程不固定。主要用于执行定时任务和固定周期任务

4、SingleThreadThreadPool 只有一个核心线程,用于确保所有任务都在同一线程中按顺序执行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: