Dart中有2中队列:Event Queue和Microtask Queue
异步-Event Queue和Microtask 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