Androidのスレッドとスレッドプール

1731 ワード

Androidではスレッドの役割を果たし、ThreadのほかにAsyncTaskやInentServiceも演じています.同時にHandlerThreadも特殊なスレッドです.
AsyncTaskでは、最下位層にスレッドプールが使用されます.InentServiceとHandlerThreadの場合、下位レベルではスレッドが直接使用されます.
AsyncTaskはスレッドプールとHandlerをカプセル化し,主にサブスレッドでのUIの更新を容易にするためである.特に時間がかかるタスクには適していません.特に時間がかかるタスクには、スレッドプールを推奨します.
HandlerThreadはメッセージループを有するスレッドであり、その内部でHandlerを使用することができる.
InentServiceはサービスで、内部ではHandlerThreadを採用してタスクを実行し、タスクの実行が完了するとInentServiceは自動的に終了し、システムに殺されにくく、できるだけタスクの実行を保証できるのが利点です.
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);