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