Android的线程和线程池

一、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 只有一个核心线程,用于确保所有任务都在同一线程中按顺序执行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值