Dart14:异步-Event Queue和Microtask Queue

Dart中有2中队列:Event Queue和Microtask Queue

异步-Event QueueMicrotask Queue

  • 优先全部执行完Microtask Queue中的Event。
  • 直到Microtask Queue为空时,才会执行Event Queue中的Event。
  • 当Event Looper正在处理Microtask Queue中的Event时候,Event Queue中的Event就停止了处理了,此时App不能绘制任何图形,不能处理任何鼠标点击,不能处理文件IO等等。
  • 绘制图形,处理鼠标点击,处理文件IO等都是在Event Queue里完成的。

流程图大致如下:

                                             

 异步-任务调度

  • 使用Future类,可以将任务加入到Event Queue的队尾
  • 使用scheduleMicrotask函数,将任务加入到Microtask Queue队尾
  • 优先全部执行完Microtask Queue中的Event。
  • 直到Microtask Queue为空时,才会执行Event Queue中的Event。

                                         

异步-new Future()

looper.dart

void main(){
  testFuture();
}
void testFuture() {
  Future f = new Future(() => print('f1'));
  Future f1 = new Future(() => null);
  //Future f1 = new Future.delayed(Duration(seconds: 1) ,() => null);
  Future f2 = new Future(() => null);
  Future f3 = new Future(() => null);
  f3.then((_) => print('f2'));
  f2.then((_) {
    print('f3');
    new Future(() => print('f4'));
    f1.then((_) {
      print('f5');
    });
  });
  f1.then((m) {
    print('f6');
  });
  print('f7');
}

输出:

D:\flutter\bin\cache\dart-sdk\bin\dart.exe --enable-asserts --enable-vm-service:41650 D:\Code\Flutter\FlutterHello\flutter_app\lib\loop.dart
lib/loop.dart: Warning: Interpreting this as package URI, 'package:flutterapp/loop.dart'.
Observatory listening on http://127.0.0.1:41650/-IBVvehD31o=/

f7
f1
f6
f3
f5
f2
f4

Process finished with exit code 0

事件的顺序如下:

1.首先在main中创建了几个Future对象和一个print('f7')

2.随后在f3,f2,f1中添加事件,因此main队列中的print('f7')最先执行。打印出f7

3.事件队列中根据Future创建的顺序,依次是f,f1.then,f2.then,f3.then。打印出f1,f6。由于f2内容比较复杂,下面单独分析

4.f2中先执行print('f3'),打印出f3,再创建一个Future会将创建的Future添加到队尾,之后调用f1.then,由于f1已经执行完毕再执行f1,此时会将这个时候的f1.then添加到微队列中,微队列的优先级比事件队列高,如果微队列有事件先执行微队列的,因此打印f5

5.之后再执行f3.then打印f2,然后打印f4

      

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值