线程池

2017-07-13  本文已影响10人  Mr_不靠谱_先森

Android中线程形态

AsyncTask的原理
HandlerThread

HandlerThread就是一种可以使用Handler的Thread,它的实现就是在run方法中通过Looper.prepare()来创建消息队列,并通过Looper.loop()来开启消息循环,这样在实际的使用中就允许在HandlerThread中创建Handler了,外界可以通过Handler的消息方式通知HandlerThread执行一个具体的任务。HandlerThread的run方法是一个无限循环,因此当明确不需要再使用HandlerThread的时候,可以通过它的quit或者quitSafely方法来终止线程的执行。HandlerThread的最主要的应用场景就是用在IntentService中。

IntentService

IntentService是一个继承自Service的抽象类,要使用它就要创建它的子类。IntentService适合执行一些高优先级的后台任务,这样不容易被系统杀死。IntentService的onCreate方法中会创建HandlerThread,并使用HandlerThread的Looper来构造一个Handler对象ServiceHandler,这样通过ServiceHandler对象发送的消息最终都会在HandlerThread中执行。IntentService会将Intent封装到Message中,通过ServiceHandler发送出去,在ServiceHandler的handleMessage方法中会调用IntentService的抽象方法onHandleIntent,所以IntentService的子类都要是实现这个方法。

Android中线程池
优点:
1.重用线程,避免线程的创建和销毁带来的性能开销;
2.能有效控制线程池的最大并发数,避免大量的线程之间因互相抢占系统资源而导致的阻塞现象;
3.能够对线程进行简单的管理,并提供定时执行以及指定间隔循环执行等功能

ThreadPoolExecutor

ThreadPoolExecutor 是线程池的真正实现,它的构造方法体统一系列的参数来配置线程池

执行任务大致遵循的原则

线程池中未达到核心线程数量,会直接启动一个核心线程
如果超过核心线程数量,任务会被添加到任务队列中排队执行
如果任务队列已满 未达到线程池最大值 会立刻启动一个非核心的线程来执行
如果线程数量达到了最大值 那么则拒绝执行该任务

分类

FixedThreadPool

一种线程数量固定的线程池,当处于空闲状态 不会被回收

CachedThreadPool

线程数量不固定,当超过60秒闲置线程会被回收

ScheduledThreadPool

核心线程数量固定管 非核心线程数量没有限制 当非核心线程空置时会被立即回收

SingleThreadPool

只有一个核心线程 任务之间不需要处理线程同步的问题

上一篇下一篇

猜你喜欢

热点阅读