第11章 Android的线程和线程池

故事扮演 提交于 2019-12-21 05:11:10

常见的线程形态

AsyncTask:不适合特别耗时的后台任务,耗时使用线程池。
                      必须在主线程中加载。
                      Android3.0以后是串行执行的,3.0以前是并行。
 
HanderThread:继承了Thread,是一种可以使用Handler的Thread,和普通的Thread的区别是在run方法中可通过Looper.prepare创建消息队列。
                           并通过Looper.loop()来开启消息循环。         
 
IntentService:抽象类,适合执行高优先级 后台任务。
                         每执行一个后台任务就必须启动一次IntentService,内部则通过消息的方式向HanderThread请求执行任务,Handler中的Looper是顺序
                         处理消息的,所以IntentService也是顺序执行后台任务的,当有多个后台任务同时存在时,后台任务会按照外界发起的顺序排队执行。
 
线程池ThreadPoolExecutor
优点:
1、重用线程中的线程避免因为线程的创建和销毁所带来的性能开销;
2、能有效控制线程池最大并发数,避免大量的线程之间因互相抢占资源导致阻塞;
3、对线程进行管理,提供定时执行以及指定间隔循环执行等功能。
publicThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory)
corePoolSize:核心线程数
maximumPoolSize:线程池所容纳最大线程数
keepAliveTime:非核心线程闲置超时时长,超过非核心线程会被回收。
unit:keepAliveTime的参数时间单位
workQueue:线程池中任务队列,线程池execute方法提交的Runnable对象会存储在这个参数中
threadFactory:为线程池提供创建新线程的功能;
 
如果线程数量已达线程池规定的最大值,拒绝执行任务,并调用RejectedExecutionHandler的rejectedExecution通知调用者。
 
分类:
1、FixedThreadPool
线程数量固定的线程池,线程处于空闲状态时不会被回收,能够快速相应外接请求。只有核心进程。
2、CachedThreadPool
线程数量不定只有非核心进程的线程池,线程空闲有超时机制,超过会被回收。适合执行大量的耗时较少任务。
3、ScheduledThreadPool
核心线程数量固定,非核心线程数没有限制,当非核心进程闲置时会被回收。用于执行定时任务和具有固定周期的重复任务。
4、SingleThreadExecutor
只有一个核心进程,确保所有任务在同一个线程中按顺序执行(FIFO执行);
 



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!