TaskFlowManager.start时主线程执行会阻塞,block任务该如何执行问题

来源:4-8 TaskFlow大乘之TaskFlowManager启动器-1

学术袁

2022-05-07 11:30:07

问题描述:

有个疑问向老师请教下:

TaskFlowManager.start在执行时,像下面的图。任务链接:start-->Task1(阻塞任务)-->Task3(异步任务)-->Task5(阻塞任务)-->Task6-(阻塞任务)...拉起LauncherActivity。

就在代码中,若startTask.start()执行后,即Task1执行完,执行到Task3(异步任务),此时会进入while(TaskRuntime.hasBlockTask()),若异步任务后面有阻塞任务则进入主动性阻塞10ms。直到执行到Task5,但是如果我在Task5后再加一个阻塞任务Task6,有一点我搞不明白 —— while(TaskRuntime.hasBlockTask())会一直阻塞,且sleep不会释放资源。在主线程一直阻塞清况下(while循环一直在做判断、阻塞10ms,阻塞任务就无法获得主线程资源),任务链怎么能得到主线程(主线程唯一)资源并去执行阻塞任务呢?


https://img.mukewang.com/climg/6275e40b0945a76d03420676.jpg

写回答

1回答

LovelyChubby

2022-05-07

因为task3是异步任务,它执行完之后,会调度下一个任务,下一个任务如果是阻塞任务则会添加到waitingTasks集合里,

由于task5,task6还没得到执行,
此时while(TaskRuntime.hasBlockTask())必然会进来,
下面还会再判断waitingTasks集合是否存在需要执行的阻塞任务,在这里会把waitingTasks里面的阻塞任务拿出来执行了,所以task5就能得到执行了; 

blockTask的意思是声明它是一个需要在主线程执行且必须执行完才能进入launchActivity的任务

而watingTask的意思是表明当前任务可以被执行了;

0

移动端架构师

亲历日活千万级APP全流程落地,成为技术强+思维深+视野广 的P7级移动端架构师

579 学习 · 452 问题

查看课程

相似问题

回答 1

回答 1

回答 1

回答 1