Android 中的线程和线程池

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 sPoolWorkQueue =  
           new LinkedBlockingQueue(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);  

你可能感兴趣的:(Android 中的线程和线程池)