Android中的线程形态

一.AsyncTask

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

四个核心方法:

onPreExecute(),主线程,用于做一些准备工作
doInBackground(Params… params),在线程池中工作,在此方法中可以通过publishProgress方法来更新任务的进度,publishProgress会调用onProgressUpdata方法。另外此方法需要返回计算结果给onPostExecte方法。
onProgressUpdata(Progress …value),在主线程中执行,当后台的执行进度发生改变的时候,该方法将会被调用。
onPostExecute(Result result),主线程中执行,在异步任务执行之后,调用此方法,其中,result参数是后台任务的返回值,即doInBackground的返回值。
(Java中,…标识参数的数量不定,它是一种数组型参数。)

使用限制:
1.必须在主线程中加载
2.主线程创建
3.execute方法在UI线程调用
4.不要再程序中直接调用onPreExecute()…等上面的方法
5.一个AsyncTask对象只能执行一次,即只能调用一次execute
6.Android 1.6之前,AsyncTask是串行执行任务,1.6之后采用线程池处理并行任务,3.0开始,为了避免AsyncTask所带来的并发错误,AsyncTask又采用了一个线程来串行执行任务。尽管如此,3.0以后的版本,我们仍然可以通过AsyncTask的executeOnExecutor方法来并行执行任务

默认情况下,AsyncTask是串行执行的,AsyncTask中有两个线程池(SerialExecutor和THREAD_POOL_EXECUTOR)和一个Handler(InternalHandler),其中SerialExecutor用于任务的排队,而线程池THREAD_POOL_EXECUTOR用于真正地任务执行,InternalHandler用于将执行环境从线程池切换到主线程中。

二.HandlerThread

HandlerThread继承了Thread,它是一种可以使用Handler的Thread,它的实现就是在run方法中通过Looper.prepare()来创建消息队列,并通过Looper.loop()开启循环,这样就在实际的使用中就允许在HandlerThread中创建Handler,外界需要通过Handler的消息方式来通知HandlerThread 执行一个具体的任务,HandlerThread 的run方法是一个无限循环,因此明确不需要使用HandlerThread的时候,可以通过他的quit,quitSafely方法来终止线程的执行。

三.IntentService

它是一个继承了Service的抽象类,可以用于后台执行任务,任务执行完了后会自动停止,适合执行一些优先级较高的后台任务,因为他的优先级比较高,每次启动时,onCreate方法会创建一个HandlerThread,然后使用它的Looper来构造一个Handler对象mServiceHandler,这样,通过mServiceHandler发送的消息都会在HandlerThread中执行。

四.线程池

(一)优点:
1.重用线程池,避免因为创建线程和销毁线程带来的性能开销
2.能有效的控制线程池中的最大并发数,避免大量的线程之间因为互相抢占资源而导致的线程阻塞现象。
3.能够对相乘进行管理,并提供定时执行以及指定间隔循环执行等功能

(二)ThreadPoolExecutor的构造方法的主要参数作用
1.coreThreadSize
核心线程数,默认情况下,核心线程会在线程池中一直存活,如果将ThreadPoolExecutor的allowCoreThreadTimeOut属性设置为true,那么闲置的核心线程在等待新任务到来时会有超时策略,这个时间间隔由keepAliveTime所指定,超过keepAliveTime,核心线程就会停止
2.maxmuuPoolSize
线程池所能容纳的最大线程数,超过这个数,后续的新任务将会被阻塞
3.keepAliveTime
非核心线程闲置时的超时时长,超过这个时长,非核心线程就会被回收。
4.workQueue
线程池中的任务队列,通过线程池的execute方法提交的Runnable对象会存储在这个参数中
5.threadFactory
为线程池提供创建线程的方法,只有一个方法:Thread new Thread(Runnale r)

(三)执行任务的规则
1.如果线程池中的线程数量未达到核心线程的数量,直接启动一个核心线程来执行任务
2.如果线程池中的线程数量已经达到或者超过核心线程的数量,将任务放入任务队列中排队等待执行
3.如果2中无法将任务插入到任务队列中,这往往是由于任务队列已满,如果此时线程数量未达到线程池的最大值,离了启动一个新线程来执行任务
4.如果3中线程数量已经达到线程池规定的最大值,那么就拒绝执行此任务,抛出异常

(四)线程池的种类
1.FixThreadPool
是一种数量固定的线程池,只有核心线程,并且没有超时机制,任务队列没有大小限制
2.CacheThreadPool
是一种数量不定的线程池,只有非核心线程,有超时机制,比较适合大量耗时较少的任务。
3.ScheduledThreadPool
核心线程数固定+不限的非核心线程数;适合用于执行定时任务和具有固定周期的重复任务
4.SingleThreadExecutor
只有一个核心线程,将所有的任务集中到一个线程中,使得处理这些任务不需要处理线程同步的问题。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值