Android面试-7 多线程

Android中的线程

Thread及其子类

可以继承Thread或者实现Runnable的方式开启新线程

AsyncTask

底层是两个线程池和一个静态Handler实现,一个线程池用于任务排队,另一个用于真正执行任务。只有doInBackground方法是在线程池中执行异步任务,其他回调方法都在主线程运行,AsyncTask类和对象一定要在主线程加载和创建,execute方法一定要在主线程调用,且只能调用一次,否则会报错。注意AsyncTask默认是串行执行,也可以通过executeOnExecutor进行并行执行。内部通过一个静态Hander将执行环境从线程池切换到主线程,由于是静态成员,在主线程加载AsyncTask类时就已经创建,所以可以切换到主线程。

HandlerThread

继承了Thread,内部封装好了Handler,具有消息循环功能,注意HandlerThread是一个无限循环,所以不需要使用时,要通过quit或quitSafely终止线程执行。

IntentService

内部采用HandlerThread执行任务,也是通过一个Handler来发送消息请求,执行完毕后可以自动退出,可以理解为后台线程服务,由于是四大组件所以不容易杀死。

Android中的线程池

线程池的好处

  • 重用线程。通过缓存一定数量的线程避免线程创建和销毁带来太大的系统开销
  • 有效控制最大并发数。避免大量线程相互抢占系统资源而导致阻塞
  • 管理线程。提供定时执行和周期循环执行策略。

线程池的配置

核心线程:创建后在线程池中一直存在(即使是闲置状态),若设置了核心线程闲置超时设定,则会被终止。

执行任务规则

  • 线程池线程数 < 核心线程数:新建一个核心线程执行或直接使用已有的闲置核心线程执行
  • 线程池线程数 >= 核心线程数:新任务插入任务队列等待
  • 任务队列已满 && 线程池线程数 <= 最大线程数:启动一个非核心线程执行任务
  • 线程数 > 最大线程数:拒绝执行此任务,调用rejectedExecutionHandler通知调用者

四大线程池

android中ThreadPoolExecutor才是线程池的真正实现,它的构造方法提供了一系列参数配置线程池,四大线程池采用了工厂模式生成。

  • FixedThreadPool

内部只有核心线程,数量固定,即使是空闲状态,线程也不会回收,设置的keepAliveTime无效,除非线程池关闭才会回收。内部任务队列采用了LinkedBlockingQueue。由于此线程池线程数量固定,且不会被回收,所以适用于任务量比较固定但耗时比较长的任务。

  • CachedThreadPool

内部全是非核心线程,线程可以无限创建,这类线程池中的空闲线程是有超时机制的,可以通过keepAliveTime设置。任务队列采用的是SynchronousQueue,这个队列无法插入任务,而是一有任务并且可以匹配到一个线程就立刻执行。适用于任务量大但每个任务耗时少的场景。

  • ScheduleThreadPool

核心线程数固定,但非核心线程数没有限制,非核心线程一闲置就被回收,keepAliveTime无效。内部采用DelayedWorkQueue,会对任务排序,其中的任务只有在到期时才会从队列中取出来,取出后新建一个线程或利用已有线程执行,从而实现延时执行队列任务。适用于执行定时任务和具体固定周期的任务。

  • SingleThreadPool

只有一个核心线程的线程池,任务队列是LinkedBlockingQueue,可以确保所有任务在同一个线程中顺序执行,不需要处理线程同步问题。适用于多任务顺序执行场景。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值