Android 学习笔记(4)之线程池和AsyncTask

1,为什么要用线程池?
降低资源消耗 重复利用
提高响应速度 不需要重新创建
提高线程的可管理性
线程池默认线程数最好不大于cpu核心数
2,创建和流程
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
corePoolSize 核心线程数
maximumPoolSize 最大线程数
keepAliveTime/TimeUnit 线程空闲存活时间/单位
BlockingQueue 阻塞队列,存放任务
ThreadFactory 新建线程的工厂。主要用于线程命名 pool-数字-thread-数字
RejectedExecutionHandler (饱和策略)异常处理机制
AbortPolicy:直接抛出异常,默认策略
CallerRunsPolicy:用调用者所在的线程来执行任务;
DiscardOldestPolicy:丢弃阻塞队列中靠最前的任务,并执行当前任务
DiscardPolicy:直接丢弃任务
工作机制原理
任务来了—创建线程 -----count=corePoolSize ----继续来任务----放到BlockingQueue—队列满了----继续来任务----- 创建线程----count=maximumPoolSize —继续来任务----异常处理/拒绝等

3,什么是阻塞队列
队列是(FIFO—first in first out)线性表
阻塞队列 队列满时,阻塞继续插入的线程
队列空时,阻塞获取数据的线程

4,合理应用线程池
任务类型 CPU密集型任务(少的线程Ncpu+1)、IO密集型任务(2*Ncpu)和混合型任务(视情况拆分)

5,AsyncTask
为什么需要AsyncTask? 耗时操作异步线程
UI控件是线程不安全 不能在子线程修改UI
异步更新 Thread+handler AsyncTask
4个方法onPreExecute,doInBackground,onProgressUpdate,onPostExecute
构造方法和执行execute()

构造方法 mWorker代表了AsyncTask要执行的任务,是对Callable接口的封装
mFuture代表了AsyncTask要执行的任务的返回结果,其实就是个FutureTask
execute() executeOnExecutor(sDefaultExecutor, params) exec.execute(mFuture)
SerialExecutor—双端队列ArrayDeque类型的mTasks 最大任务128
更新UI都调用handler.obtainMessage

创建两个线程池SerialExecutor和ThreadPoolExecutor,SerialExecutor负责将任务串行化,ThreadPoolExecutor是真正执行任务的地方,
AsyncTask不失为一个非常好用的异步任务处理类,只要不是频繁对大量UI进行更新,可以考虑使用;而Handler在处理大量UI更新时可以考虑使用。

6,CAS(Compare and Swap),
什么是原子操作?如何实现原子操作?
无法被别的线程打断的操作。要么不执行,要么就执行成功
可以使用锁机制
可以使用CAS指令
每一个CAS操作过程都包含三个运算符:一个内存地址V,一个期望的值A和一个新值B,操作的时候如果这个地址上存放的值等于这个期望的值A,则将地址上的值赋为新值B,否则不做任何操作
CAS缺点 ABA问题 解决方法加序号 1A-2B-3A
循环时间长开销大
只能保证一个共享变量的原子操作。
为什么选用CAS(乐观锁) 为加锁或使用 synchronized 关键字带来的性能损耗较大

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值