Android的线程和线程池

线程的角色

  在Android系统中,除了Thread本身之外,可以充当线程的还有AsyncTask,IntentService,HandlerThread,但其本质仍然是线程.其中,AsyncTask底层实现是线程池,IntentService和HandlerThread则直接使用了线程.

使用环境

AsyncTask

封装了Thread和Handler,主要用于子线程更新UI,但不适合用于非常耗时的任务.

使用限制:

AsyncTask必须在主线程中加载;
AsyncTask对必须在主线程中调用;
AsyncTask中的execute()必须在UI线程中调用;
AsyncTask对象只能执行一次,即只能执行一次execute()方法(串行)

HandlerThread

一个具有消息循环的线程,在其内部可以使用Handler,实现主要是在run()方法中通过Looper.prepare()创建消息队列,并通过Looper().loop()来开启消息循环.

IntentService

内部封装了HandlerThread和Handler使用HandlerThread来执行任务,当任务执行完毕后会自动退出.尽管IntentService看起来像是一个后台线程,但其本质是一种服务,不容易被系统杀死的服务.

过程:

IntentService第一次被调用时,它的onCreate()会被调用,内部创建一个HandlerThread实例,并通过Looper构造出一个Handler对象,这样通过Handler对象发送的消息最终都会在HandlerThread中执行.
每次调用时,它的startCommand()都会被调用,处理每个后台任务的Intent,内部其实是调用onStart()接收Message,并处理Intent,当任务执行完那比后就会通过stopSelf(int startId)来停止任务.

线程池

主要分为四类
FixedThreadPool:只有核心线程数,反应快
CacheThreadPool:只有非核心线程数,数量不定,超时限制60秒,适合只想大量耗时较小的任务
ScheduledThreadPool:核心线程固定,非核心线程不定,主要用于执行定时任务和具有周期的重复任务
SingleThreadExecutor:只有一个核心线程,不需要处理同步问题
但本质都是间接或直接通过配置ThreadPoolExecutor来实现的

好处:

重用线程,避免线程的创建以及销毁所带来打性能开销;
能有效控制线程池中的最大并发数,避免大量的线程因互相抢夺资源而导致阻塞
能对线程进行简单的管理,并提供定时执行以及指定间隔循环等功能

ThreadPoolExecutor

主要参数
corePoolSize:核心线程,默认情况下一直存活
maximumPoolSize:最大线程数,超过的话,后续新任务被阻塞
keepAliveTime:非核心线程的超时时长,超过会被回收
workQueue:任务队列,通过线程池中的execute()提交的Runnable对象会存储在这里
在AsyncTask中有明显的显示:
核心线程数等于CPU核心数+1
最大线程数等于CPU核心数*2+1
非核心线程超时设置为1秒
任务队列容量128

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值