1.使用的是SerialExecutor封装ThreadPoolExecutor,该成员是static,使派发到SyncTask的任务使串行的。
2.doInbackground在线程池的线程中执行
3.而onPreExecute在调用SyncTask#execute的线程执行
4.onPostExecute在主线程中执行,因为是通过handler把任务结束的消息及结果对象传到其他线程的,通过Looper#getMainLooper()获得主线程Looper并构造一个Handler。
5.SyncTask#execute()方法会返回一个FutrueTask,该类继承了Runnable和Future,可以使用FutureTask.get()等待后台任务执行完。
FutureTask实现get()方法,阻塞线程。使用WaitNode,先检测任务是否已完成,如果完成就不用park了;如果没有完成就建立一个WaitNode,加入等待队列,然后在park前必须先再检查一遍任务是否已完成,由于与任务执行是异步的,所以有可能在第一次检查后waitnode还没加入队列,任务就完成了,那么该线程park后就会死锁,而只要保证是加入队列才完成的,那么park就是安全的,因为LockSupport#unpark(Thread)对于还没有park的线程同样有效,就是线程A没有park,而被unpark后,线程A再park,此时线程A不会阻塞。这个和同步队列的实现原理是一样的。