- 创建发送端和接受端
- 发送端调用spawn方法,将async块封装成Task发送到channel中
- 接受端while循环revc方法,每次会循环会阻塞,直到接受到Task
- 取出task中的future,Poll一次
- 第一次poll后,async块开始执行
- async块执行如图,new 一个TimerFuture
- new方法返回之前开启了一个新的线程
- new方法返回TimerFuture如图第二个黄框,然后poll一下
- 发现poll返回Pending,就会放回future到Task(task放)。
- 第二次循环开始,revc阻塞
- Sleep(2)代表代码执行需要cost一些时间
- 完成后TimerFuture中的一些field update完成
- 这里能更新是因为
Arc<Mutex>
,共享内存,一起修改
- 这里能更新是因为
- 新线程结束时调用wake方法
下面的都在第三个图
- Task的wake方法发送一个新的Task到channel中
- 主线程的Receiver接受到Task,开始第二轮执行
此时在主线程执行
- 第二轮poll发现新线程更新了completed为true,所以结束返回Ready
- 此时async块执行结束
- run方法发现ready了,那么task就不会放回,channel关闭,run方法结束