美文网首页
flutter-异步-事件队列

flutter-异步-事件队列

作者: 浮华_du | 来源:发表于2021-06-07 10:07 被阅读0次

Dart 中事件的执行顺序:Main > MicroTask > EventQueue

Dart app运⾏后默认创建的isolate为main isolate, 主程序的main⽅法就运⾏在这⾥。isolate创建时都会包含⼀个event loop和两个队列 event queue 和 microtask queue。

程序运⾏后main⽅法中的所有代码都是同步执⾏的,不会进⼊任何⼀个队列,main⽅法执⾏完之后event loop才会从microtask queue中取任务来执⾏,当microtask queue中任务都执⾏结束, event loop会去取event queue中的第⼀个任务来执⾏,执⾏完后会再次检查microtask queue中是否有任务。也就是说event queue每次执⾏⼀个任务,任务结束后会再次检查microtask queue中是否有待处理的任务,如果有,就会先 将microtask queue中的任务都处理完,再去event queue执⾏下⼀个。


事件队列.png
 new Future(() => print('Future==event queue 1'));
    scheduleMicrotask((){
      print("Microtask===1");
    });
    new Future(() => print('Future==event queue 2'));
    scheduleMicrotask((){
      print("Microtask===2");
    });
    new Future(() => print('Future==event queue 3'));
    scheduleMicrotask((){
      print("Microtask===3");
    });
    print('main');

// I/flutter (31521): main
// I/flutter (31521): Microtask===1
// I/flutter (31521): Microtask===2
// I/flutter (31521): Microtask===3
// I/flutter (31521): Future==event queue 1
// I/flutter (31521): Future==event queue 2
// I/flutter (31521): Future==event queue 3

多个Future

  • 规则一:Future 的执行顺序为Future的在 EventQueue 的排列顺序。类似于 JAVA 中的队列,先来先执行。
  • 规则二:当任务需要延迟执行时,可以使用 new Future.delay() 来将任务延迟执行。
  • 规则三: Future 如果执行完才添加 then ,该任务会被放入 microTask,当前 Future 执行完会执行 microTask,microTask 为空后才会执行下一个Future。
  • 规则四:Future 是链式调用,意味着Future 的 then 未执行完,下一个then 不会执行。

情况一:Future没有执行完成(有任务需要执行),那么then会直接被添加到Future的函数执行体后;
情况二:如果Future执行完后就then,该then的函数体被放到如微任务队列,当前Future执行完后执行微任务队列;
情况三:如果Future世链式调用,意味着then未执行完,下一个then不会执行;

    Future f1 = new Future(() => print('f1'));
    Future f2 = new Future(() =>  null);
    Future f3 = new Future.delayed(Duration(seconds: 1) ,() => print('f3-delay'));
    Future f4 = new Future(() => null);
    Future f5 = new Future(() => null);

    f5.then((_) => print('f5-then'));
    f4.then((_) {
      print('f4-then');
      Future f6 = new Future(() => print('f4-then===f6'));
      f2.then((_) {
        print('f4-then==f2-then');
        Future f7 = new Future(() => null);
        Future f8 = new Future(() => print('f4-then===f2-then===f8'));
        f7.then((value) => print('f4-then===f2-then===f7-then'));
      });
    });
    f2.then((m) {
      print('f2-then');
    });
    print('main==8');

 // I/flutter (31521): main==8
  // I/flutter (31521): f1
  // I/flutter (31521): f2-then
  // I/flutter (31521): f4-then
  // I/flutter (31521): f4-then==f2-then
  // I/flutter (31521): f5-then
  // I/flutter (31521): f4-then===f6
  // I/flutter (31521): f4-then===f2-then===f7-then
  // I/flutter (31521): f4-then===f2-then===f8
  // I/flutter (31521): f3-delay

例子打印分析:

  • main==8
  • f1 f2 f4 f5按顺序直接执行,f3 延时1s后执行 且属于 event queue,打印f1
  • 按照Future加入的顺序执行then操作
  • f1没有then操作; f2执行完添加then,该任务被加入microTask优先执行,打印f2-then
  • f3有延时,且没有then操作; f4执行完添加then,该任务被计入microTask优先执行,打印f4-then
  • f4 then中, f6加入event queue, f2执行完添加then,该任务被加入microTask优先执行,优先于f5的then 打印f4-then==f2-then
  • f2 then执行完,f7 f8任务加入event queue
  • f5执行完添加then,该任务被计入microTask优先执行,打印f5-then
  • microTask中没有任务了,event queue 中f6 f7直接执行,打印f4-then===f6
  • f7执行完添加then,该任务被计入microTask优先执行,打印f4-then===f2-then===f7-then
  • microTask中没有任务了,f8直接执行,打印f4-then===f2-then===f8
  • 1s后 microTask中没有任务了,f3直接执行,打印f3-delay

多个MicroTask + 多个Future

   Future f1 = new Future(() => print('1'));
    scheduleMicrotask(() => print('2'));
    Future f3 = new Future.delayed(new Duration(seconds: 1), () => print('3'));

    Future f4 = new Future(() => print('4'));
    Future f5 = f4.then((_) {
      scheduleMicrotask(() => print('5'));
      new Future(() => print('6'));
      print('7');
    });
    f5.then((_) => print('8'));


    Future f6 = new Future(() => print('9'));
    Future f7 = f6.then((_) {
      scheduleMicrotask(() => print('10'));
      new Future(() => print('11'));
      print('12');
    });
    f7.then((_) => print('13'));

    Future f8 = new Future(() => print('14'));
    Future f9 = f8.then((_) =>new Future(() => print('15')));
    f9.then((_) => print('16'));

    new Future(() => print('17'));
    scheduleMicrotask(() => print('18'));
    print('19');

  // I/flutter (11181): 19
  // I/flutter (11181): 2
  // I/flutter (11181): 18
  // I/flutter (11181): 1
  // I/flutter (11181): 4
  // I/flutter (11181): 7
  // I/flutter (11181): 8
  // I/flutter (11181): 5
  // I/flutter (11181): 9
  // I/flutter (11181): 12
  // I/flutter (11181): 13
  // I/flutter (11181): 10
  // I/flutter (11181): 14
  // I/flutter (11181): 17
  // I/flutter (11181): 6
  // I/flutter (11181): 11
  // I/flutter (11181): 15
  // I/flutter (11181): 16
  // I/flutter (11181): 3

按照以上思路,是否可以分析这段代码的打印结果?

https://zhuanlan.zhihu.com/p/161202064

相关文章

  • flutter-异步-事件队列

    Dart 中事件的执行顺序:Main > MicroTask > EventQueue Dart app运⾏后默认...

  • Spark Core源码精读计划#6:AsyncEventQue

    目录 前言 异步事件队列AsyncEventQueueeventQueue、eventCount属性dropped...

  • js笔记

    Javascript 事件循环: js解析方法时,将同步任务排队到执行栈中,异步任务排队到事件队列中。 事件队列分...

  • flutter-异步编程

    首先看一张Flutter体系结构图: 我们只关注线程相关信息 1、Framework:我们直接接触的层级 2、en...

  • flutter-异步编程

    Dart执行(运行在UI task runner ,root isolate) 优先执行Miscrotask队列 ...

  • flutter-异步支持

    Future用来异步操作。1.延时发送Future.then() 2.异常捕获Future.catchError ...

  • 事件循环机制

    JS 有个全局的函数执行栈,这是执行同步函数的地方 除了函数执行栈,还有一个事件队列,这是执行异步函数的地方 异步...

  • Flutter-现有iOS工程引入Flutter

    Flutter-现有iOS工程引入Flutter Flutter-现有iOS工程引入Flutter

  • Flutter-线程与异步

    1、线程 Flutter 主要分为三个核心模块: Framework:基于Dart语言构建的framework,包...

  • Vue系列-异步事件队列(nextTick)

    when:Vue什么时候用到异步事件队列 1、VUE通过设置对象属性的setter拦截,可以在属性值发生变化时触发...

网友评论

      本文标题:flutter-异步-事件队列

      本文链接:https://www.haomeiwen.com/subject/akxcsltx.html