「这是我参加11月更文挑战的第22天,活动详情检查:2021最终一次更文挑战」
咱们在前面已经大致了解了Flutter中Future的运行机制,那么除了Future,Flutter中是否还有其他使命机制呢?
咱们先来看一段代码:
void testFuture() {
print('外部代码1');
Future(() => print('使命A')).then((value) => print('A使命结束'));
Future(() => print('使命B')).then((value) => print('B使命结束'));
print('外部代码2');
}
依照咱们在之前文章中介绍的Future的用法及履行流程,咱们很容易就能猜到运行成果:
那么,如果在代码运行过程中,忽然有紧急使命需求先履行,那么有没有方法处理呢?这就要使用到微使命来做处理了;
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微使命,那么代码的履行成果是什么呢?
根据打印信息,咱们发现咱们在Future后边增加的scheduleMicrotask微使命居然优先履行了;scheduleMicrotask拥有较高的优先级,从而咱们也能够确定在这段代码履行的过程中是有两个行列存在的,否则微使命不发优先履行;
Dart中的行列
在Dart中是有两种对类存在的:
-
event queue事情行列:这种行列包含所有的外来事情,如I/O、mouse events、drawing events、timers和Isolate等之间的信息传递; -
microtask queue微使命行列:这种行列表示一个短时刻内就会完成的异步使命。它的优先级最高,只需此行列中还有使命,就能够一向强占着事情循环。microtask queue增加的使命主要是由Dart内部发生的。
需求留意的是,正因为
microtask queue行列的优先级高于event queue行列,所以如果在microtask queue中的微使命过多,那么就有或许一向强占当时的事情循环(event loop)。从而对event queue中的接触、制作等事情发生影响,导致这些时刻发生阻塞卡顿;
在每一次的事情循环中,Dart总是会优先在microtask queue行列中查询是否还有可履行的使命,如果该行列中没有需求处理的使命,那么才会处理event queue行列中的使命及其流程;
在异步使命中,咱们使用的最多的仍是优先级较低的event queue。Dart中为event queue的使命做了一层封装,也便是咱们之前使用过的Future;
Dart中Future异步使命的履行流程:
- 声明一个
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
咱们检查打印成果:
确实和咱们预料的相同,那么咱们将代码作如下修正呢?
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的使命中,增加了一个微使命,那么咱们来看一下此时的打印成果:
看到这个成果,咱们不免会发生疑问?scheduleMicrotask是微使命,那么他的优先级应该是最高的,那么8为什么会在7的后边打印呢?
此处需求留意的是,then内部的代码,咱们能够看做这部分代码被扔在了微使命行列中,而scheduleMicrotask虽然也是微使命,但是此时它仅仅是扔在了微使命行列中,当时的微使命行列中还有打印7的使命,所以最终是7在8的前边打印;




