「这是我参加11月更文挑战的第22天,活动详情检查:2021最终一次更文挑战」

咱们在前面已经大致了解了FlutterFuture的运行机制,那么除了FutureFlutter中是否还有其他使命机制呢?

咱们先来看一段代码:

void testFuture() {
  print('外部代码1');
  Future(() => print('使命A')).then((value) => print('A使命结束'));
  Future(() => print('使命B')).then((value) => print('B使命结束'));
  print('外部代码2');
}

依照咱们在之前文章中介绍的Future的用法及履行流程,咱们很容易就能猜到运行成果:

Flutter(二十四)-Dart事件循环机制

那么,如果在代码运行过程中,忽然有紧急使命需求先履行,那么有没有方法处理呢?这就要使用到微使命来做处理了;

scheduleMicrotask

scheduleMicrotask又称为微使命,咱们将代码修正一下,增加一个微使命看一下代码的履行流程发生了什么变化?咱们将代码修正如下:

void testFuture() {
  print('外部代码1');
  Future(() => print('使命A')).then((value) => print('A使命结束'));
  Future(() => print('使命B')).then((value) => print('B使命结束'));
  scheduleMicrotask(() {
    print('微使命A');
  });
  sleep(const Duration(seconds: 1));
  print('外部代码2');
}

在代码的履行流程中增加了scheduleMicrotask微使命,那么代码的履行成果是什么呢?

Flutter(二十四)-Dart事件循环机制

根据打印信息,咱们发现咱们在Future后边增加的scheduleMicrotask微使命居然优先履行了;scheduleMicrotask拥有较高的优先级,从而咱们也能够确定在这段代码履行的过程中是有两个行列存在的,否则微使命不发优先履行;

Dart中的行列

Dart中是有两种对类存在的:

  • event queue事情行列:这种行列包含所有的外来事情,如I/Omouse eventsdrawing eventstimersIsolate等之间的信息传递;
  • microtask queue微使命行列:这种行列表示一个短时刻内就会完成的异步使命。它的优先级最高,只需此行列中还有使命,就能够一向强占着事情循环。microtask queue增加的使命主要是由Dart内部发生的。

需求留意的是,正因为microtask queue行列的优先级高于event queue行列,所以如果在microtask queue中的微使命过多,那么就有或许一向强占当时的事情循环(event loop)。从而对event queue中的接触、制作等事情发生影响,导致这些时刻发生阻塞卡顿;

在每一次的事情循环中,Dart总是会优先在microtask queue行列中查询是否还有可履行的使命,如果该行列中没有需求处理的使命,那么才会处理event queue行列中的使命及其流程;

在异步使命中,咱们使用的最多的仍是优先级较低的event queueDart中为event queue的使命做了一层封装,也便是咱们之前使用过的Future

DartFuture异步使命的履行流程:

  • 声明一个Future时,Dart会将异步使命的函数履行体放入event queue中,然后立即返回,后续的代码继续进行同步履行;
  • 当同步履行的代码履行结束后,event queue会依照参加的次序也便是声明次序,顺次取出事情,最终同步履行Future的函数体及后续操作;

事情示例

咱们来界说一串使命,代码如下:

void testFuture() {
  Future f1 = Future(() => null);
  f1.then((value) {
   print('6');
  }).then((value) => print('7'));
  Future f2 = Future(() => print('1'));
  f2.then((value){
    print('4');
  });
  Future(() => print('2'));
  scheduleMicrotask(() {
    print('3');
  });
  print('5');
}

依照咱们对Future使命履行次序的理解,以及scheduleMicrotask具有较高优先级的履行权,那么其打印次序应该是:

5、3、6、7、1、4、2

咱们检查打印成果:

Flutter(二十四)-Dart事件循环机制

确实和咱们预料的相同,那么咱们将代码作如下修正呢?

void testFuture() {
  Future f1 = Future(() => null);
  f1.then((value) {
   print('6');
   scheduleMicrotask(() {
     print('8');
   });
  }).then((value) => print('7'));
  Future f2 = Future(() => print('1'));
  f2.then((value){
    print('4');
  });
  Future(() => print('2'));
  scheduleMicrotask(() {
    print('3');
  });
  print('5');
}

咱们在f1的使命中,增加了一个微使命,那么咱们来看一下此时的打印成果:

Flutter(二十四)-Dart事件循环机制

看到这个成果,咱们不免会发生疑问?scheduleMicrotask是微使命,那么他的优先级应该是最高的,那么8为什么会在7的后边打印呢?

此处需求留意的是,then内部的代码,咱们能够看做这部分代码被扔在了微使命行列中,而scheduleMicrotask虽然也是微使命,但是此时它仅仅是扔在了微使命行列中,当时的微使命行列中还有打印7的使命,所以最终是78的前边打印;