一、线程分类
1、线程分主线程和子线程主线程:主要处理和界面相关的操作
子线程:负责处理一些耗时的操作;
二、Android中的线程形态
AsyncTask:封装了线程池和Handler,主要是为了方便开发者在子线程中更新UI,不适合进行特别耗时的操作
HandlerThread:是一种具有消息循环的线程,在它的内部可以使用Handler
IntentService:可用于执行后台耗时的任务,因为它的优先级高不容易被系统杀死,所以比较适合执行一些高优先级的后台任务
三、线程池的优点有以下三点
1、重用线程池中的线程,避免因为线程的创建和销毁所带来的性能开销。
2、能有效控制线程池的最大并发数,避免大量的线程之间因互相抢占系统资源而导致的阻塞现象。
3、 能够对线程进行简单的管理,并提供定时执行以及制定间隔循环执行等功能。
四、线程池的真正实现:ThreadPoolExecutor
五、常见四类具有不同功能特性的线程池
1、FixedThreadPool
a、线程数量固定
b、只有核心线程,且没有超时机制,不会被回收,其意味着能够加速的响应外界的请求
c、所有线程处于活动状态时,新任务处于等待状态,直到有线程空闲出来
d、线程处于空闲状态时,不会被回收,除非线程池被关闭
2、CachedThreadPool
a、线程数量不定
b、只有非核心线程,最大线程数可以任意大(Integer.MAX_VALUE)
c、所有线程处于活动状态时,会创建新的线程来处理新任务,否则会利用空闲的线程来处理新任务
d、线程处于空闲状态时,超过60秒闲置线程会被回收
e、整个线程池都处于闲置状态,线程池中的线程都会超时,此时CachedThreadPool之中实际上是没有任何线程,几乎不占用任何系统资源
f、任务队列是一个空集合,这导致任何任务都会被立即执行
g、适合执行大量的耗时较少的任务
3、ScheduledThreadPool
a、核心线程数量固定,非核心线程数无限制,且非核心线程闲置时会立即被回收
b、主要用于执行定时任务和具有固定周期的重复任务
4、SingleThreadExecutor
a、只有一个核心线程,确保所有任务都在同一线程中按顺序执行
b、意义在于统一所有的外界任务到一个线程中,使得任务之间不用处理线程同步问题
四类线程池代码实现如下
Runnable command =new Runnable(){
@Override
public void run(){
SystemClock.sleep(2000);
}
}
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
fixedThreadPool.exceute(command);
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
cachedThreadPool.execute(command);
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(4);
//2000ms后执行command
scheduledThreadPool.schedule(command,2000, TimeUnit.MILLISECONDS);
//延时10ms后,每隔1000ms执行一次command
scheduledThreadPool.scheduleAtFixedRate(command,10, 1000, TimeUnit.MILLISECONDS);
ExecutorServicesingleThreadExecutor = Executors.newSingleThreadExecutor();
singleThreadExecutor.execute(command);