Android中扮演线程角色,除了 Thread 之外,AsyncTask 和 IntentService 也是。同时 HandlerThread 也是一种特殊的线程。
对于 AsyncTask,底层用到了线程池。
对于 IntentService 和 HandlerThread,底层直接使用线程。
AsyncTask 封装了 线程池 和 Handler,它主要是为了方便在子线程中更新 UI。不适合进行特别耗时的任务,对于特别耗时的任务,建议采用线程池。
HandlerThread 是一种具有消息循环的线程,在它内部可以使用 Handler。
IntentService 是一个服务,内部采用 HandlerThread 来执行任务,当任务执行完毕后 IntentService 会自动退出,它不容易被系统杀死从而可以尽量保证任务的执行,这是它的优点。
AsyncTask 构造线程池的方法:
//获取当前的cpu核心数
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
//线程池核心容量
private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
//线程池最大容量
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
//过剩的空闲线程的存活时间
private static final int KEEP_ALIVE = 1;
//ThreadFactory 线程工厂,通过工厂方法newThread来获取新线程
private static final ThreadFactory sThreadFactory = new ThreadFactory() {
//原子整数,可以在超高并发下正常工作
private final AtomicInteger mCount = new AtomicInteger(1);
public Thread newThread(Runnable r) {
return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
}
};
//静态阻塞式队列,用来存放待执行的任务,初始容量:128个
private static final BlockingQueue<Runnable> sPoolWorkQueue =
new LinkedBlockingQueue<Runnable>(128);
/**
* 静态并发线程池,可以用来并行执行任务,尽管从3.0开始,AsyncTask默认是串行执行任务
* 但是我们仍然能构造出并行的AsyncTask
*/
public static final Executor THREAD_POOL_EXECUTOR
= new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);