美文网首页
AsyncTask和线程池

AsyncTask和线程池

作者: 伪代码 | 来源:发表于2017-04-15 10:13 被阅读0次

    这篇文章还是根据《android艺术开发探索》的笔记

    AsyncTask封装了线程池和handler

    主线程的作用是运行四大组件以及处理他们和用户的交互

    AsyncTask必须在主线程中加载,execute方法必须运行在Ui线程中,一个AsyncTask对象只能执行依次,也就是只能调用一次execute方法。

    AsyncTask的工作原理:先从他的execute方法开始,他会调用executeOnExecutor方法,并给它传递一个串行的Executor(SerialExecutor),然后将参数封装为FutureTask对象,他是一个并发类,充当Runnable的作用,在execute里面最先执行onPreExecute方法,然后将FutureTask对象通过SerialExecutor的对象的execute方法传递进来,在这里面,首先会把FutureTask对象插入到mTasks中,如果当前没有AsyncTask任务,就执行下一个任务,从这可以充分看出,默认情况下AsyncTask.execute()是串行的。

    AsyncTask有两个线程池,SerialExecutoe和THREAD_POOL_EXECUTOR,还有一个Handler(InternalHandler),SerialExecutoe是用于任务的排队的,而THREAD_POOL_EXECUTOR是真正执行任务的,而InternalHandler是将执行的环境从线程池切换到主线程。怎么切换的呢?上面说到FutureTask在任务栈里面,在SerialExecutor.execute()中会调用FutureTask的run()方法,在run中又会调用mWorker的call方法,call最终会在线程池中执行,在call中,会通过Message将result发送出去,会在IntermalHandler中handleMessage方法中收到Message,而IntermalHandler是静态对象,就必须要求在主线程中创建。如果收到MESSAGE_POST_RESULT消息后,就会调用AsyncTask的finish方法,在这里有一个小逻辑,但是有大作用,首先会判断isCancelled,true就会调用onCancelled方法,false就会调用onPostExecute方法,也就是说  run完了以后才会调用这两个方法,然后在中间取消的话,仅仅就是不调用onPostExecute方法。

    最后声明一下,android在3.0之前是并行的线程,之后就是串行的,当然也可以调用executeOnExecutor方法也可以实现并行。

    HandlerThread:是一种可以使用handler的Thread,就是在run方法中通过Looper.prepare方法来创建消息队列,并通过Looper.loop()来开启消息循环。由于HandlerThread的run是一个无限循环,因此不需要的时候,就把他quit或者quitSafely终止掉。

    IntentService:是一种特殊的Service,可用以执行耗时的后台任务,由于它是Service,所以他的优先级比单纯的线程要高。

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

    ThreadPoolExecutor是线程池的实现类,他的构造函数的参数有好多个,在这就大概介绍一下吧,corePoolSize 代表的是线程池的核心线程数,默认情况下,他会一直存活下去,如果ThreadPoolExecutor的属性allowCoreThreadTimeOut设置为true的话,他就和非核心线程一样了,就有了超时策略。如果超过了keepLive的时间的话,coreThread就会被终止。

    maximumPoolSize代表的是 最大线程数,当活动线程达到这个数值之后,后续的新任务就会被阻塞

    keeoAliveTime 代表的是非核心线程闲置的超时时长,allowCoreThreadTimeOut设置为true的话,核心线程也会被收回。

    unit 指定keepAliveTime参数的时间单位,这是一个枚举类型。

    threadFactory:线程工厂,为线程池提供创建新线程的功能,它是一个接口

    这儿有一个现象:当核心线程都在执行任务的时候,如果再来一个任务,他不会创建非核心线程来执行,而是把他们加到任务队列里,然后等待核心线程。如果任务队列满了以后,他才会创建非核心线程。

    线程池的分类有四种,分别为FixedThreadPool  CashedThreadPool  ScheduledThreadPool  以及SingleThreadExecutor  具体可以查看网上的资料。

    相关文章

      网友评论

          本文标题:AsyncTask和线程池

          本文链接:https://www.haomeiwen.com/subject/tidnattx.html