Android应用程序线程消息循环模型分析(5)
-
private static final BlockingQueue<Runnable> sWorkQueue =
-
new LinkedBlockingQueue<Runnable>(10);
-
-
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());
-
}
-
};
-
-
......
-
-
private static final ThreadPoolExecutor sExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE,
-
MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sWorkQueue, sThreadFactory);
-
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,
-
BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory)
简单来说,ThreadPoolExecutor的运行机制是这样的:每一个工作任务用一个Runnable对象来表示,当我们要把一个工作任务交给这个线程池来执行的时候,就通过调用ThreadPoolExecutor的execute函数来把这个工作任务加入到线程池中去。此时,如果线程池中的线程数量小于corePoolSize,那么就会调用threadFactory接口来创建一个新的线程并且加入到线程池中去,再执行这个工作任务;如果线程池中的线程数量等于corePoolSize,但是工作任务队列workerQueue未满,则把这个工作任务加入到工作任务队列中去等待执行;如果线程池中的线程数量大于corePoolSize,但是小于maximumPoolSize,并且工作任务队列workerQueue已经满了,那么就会调用threadFactory接口来创建一个新的线程并且加入到线程池中去,再执行这个工作任务;如果线程池中的线程量已经等于maximumPoolSize了,并且工作任务队列workerQueue也已经满了,这个工作任务就被拒绝执行了。
-
private static final InternalHandler sHandler = new InternalHandler();
-
public AsyncTask() {
-
mWorker = new WorkerRunnable<Params, Result>() {
-
public Result call() throws Exception {
-
......
-
return doInBackground(mParams);
-
}
-
};
-
-
mFuture = new FutureTask<Result>(mWorker) {
-
@Override
-
protected void done() {
-
Message message;
-
Result result = null;
-
-
try {
-
result = get();
-
} catch (InterruptedException e) {
-
android.util.Log.w(LOG_TAG, e);
-
} catch (ExecutionException e) {
-
throw new RuntimeException("An error occured while executing doInBackground()",
-
e.getCause());
-
} catch (CancellationException e) {
-
message = sHandler.obtainMessage(MESSAGE_POST_CANCEL,
-
new AsyncTaskResult<Result>(AsyncTask.this, (Result[]) null));
-
message.sendToTarget();
-
return;
-
} catch (Throwable t) {
-
throw new RuntimeException("An error occured while executing "
-
+ "doInBackground()", t);
-
}
-
-
message = sHandler.obtainMessage(MESSAGE_POST_RESULT,
-
new AsyncTaskResult<Result>(AsyncTask.this, result));
-
message.sendToTarget();
-
}
-
};
-
}
-
private static abstract class WorkerRunnable<Params, Result> implements Callable<Result> {
-
Params[] mParams;
-
}
-
public final AsyncTask<Params, Progress, Result> execute(Params... params) {
-
......
-
-
mWorker.mParams = params;
-
sExecutor.execute(mFuture);
-
-
return this;
-
}
-
mWorker = new WorkerRunnable<Params, Result>() {
-
public Result call() throws Exception {
-
......
-
return doInBackground(mParams);
-
}
-
};