线程及线程池的理解涉及AsyncTask 、HandlerThread、IntentService、Handler

Handler的原理:

android的主线程activityThread,主线程的入口方法是main方法,在main方法中会创建一个looper,创建looper时候,looper的构造函数里会创建一个MessageQueue,创建完成之后,在主线程的main方法里会调用Looper.loop()来开启主线程的消息循环。

我们在使用的时候,就会在主线程中创建创建一个Handler,Handler的主要功能是发送和接收消息;Handler通过post和send方法将Message发送到MesQueue中,然后looper不断轮询消息队列将Message交给Handler进行处理。

HandlerThread的解析:

它使用着可以使用Handler的Thread,它的实现很简单,就是在run()方法里创建了一个Looper,在Loop的构造函数中又创建了一个消息队列MessageQueue。

IntentService的解析:

IntentService是一种特殊的服务,它继承了service并且是一个抽象类,所以必须要创建它的子类才可以使用。

我们点进IntentService的源码可以看到,在IntentService的oncreate()方法中,创建了一个HandlerThread,并且通过这个线程获取到它的looper,这样它就用这个looper去构造了一个Handler。

在onStart(Inten intent,int startId)中将intent和startId通过刚才创建的handler发送出去,这个消息会子啊HandlerThread中进行被处理,Handler接收这个消息后就会将接收到的Intent交给onHandlerIntent()中处理,onHandlerIntent()是一个抽象方法。

onHandlerIntent()处理完成后会调用stopSelf(int startId)来关闭服务,所以IntentService不用手动关闭服务了。

AsyncTask的剖析:

AsyncTask是一个抽象的泛型类,所以需要创建它的子类才可以使用。

AsyncTask内部封装了Thread和Handler,并且内部使用的线程池,所以它比单纯的使用Handler+Thread的性能要好。

线程池的分类:

FiexThreadPool 定义一个固定数量的线程池,可控制最大并发数,防止过多线程抢占资源造成阻塞;如果设定最大并发数为10,现在要开启5个线程,过来一段时间又去开启1个线程,这个时候前面五个线程有执行完毕变成空闲线程了,那么新的任务就会利用这个空线程来处理任务,如果现在要同时开启12个线程,超出的线程会在线程队列workQueue中等待。

CachedThreadPool 它是一种数量不定的线程池,数量可以任意大,当线程池的线程都处于活动时,线程池就会创建新的线程来处理新任务,否则就会利用空的线程来处理新任务;这个线程池中的空线程都有超时机制,这个超时时长为60s超过60s就会被回收。

ScheduledThreadPool 核心线程数量固定,支持定时和周期性的任务执行。

SingleThreadPool 内部只有一个核心线程,确保所有的任务都在同一个线程中按顺序执行,这些任务之间不需要处理线程同步的问题了。

你可能感兴趣的:(线程及线程池的理解涉及AsyncTask 、HandlerThread、IntentService、Handler)