在Android SDK中的AsyncTask(内部实现)这里,
sDefaultExecutor
使用volatile
关键字声明,并且SerialExecutor
中的execute()
方法使用synchronized
关键字声明。
- 由于AsyncTask只能从UI线程执行,而且如果我们执行一个AsyncTask实例,除非前一个实例已经完成执行,否则我们不能再次执行同一个实例。那么这里怎么可能存在多个线程的情况呢?
SerialExecutor
为什么有一个ArrayDeque
?因为在任何时候,我们只能有一个任务。如果我们创建一个新的AsyncTask实例,那么我们不会得到一个新的ArrayDeque
实例吗?它还是只处理一个任务。ThreadPoolExecutor
也是一样的道理。为什么需要线程池,当对于一个AsyncTask实例,我们只有一个任务?一个线程就足够了。