AsyncTask及FutureTask#get()方法的实现

本文深入探讨了SyncTask的执行流程,包括其如何利用SerialExecutor实现任务串行处理,以及doInBackground、onPreExecute和onPostExecute等方法在不同线程中的执行机制。同时,详细解析了FutureTask的get()方法如何通过WaitNode实现线程阻塞与唤醒,确保了任务执行的安全性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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不会阻塞。这个和同步队列的实现原理是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值