Flutter学习—Dart线程和事件

Dart是单线程的,所有代码都运行在某个isolate中。app入口的main函数就是一个isolate。需要的时候可以使用isolateAPI来创建新的isolate,不同的isolate之间只能通过isolateAPI进行通信。

Dart运行环境中靠事件驱动,通过event loop从队列中获取消息。在一个isolate中有两个队列,event queuemicrotask queue

7700793-9c05b03430ae4e7c.png

如图:app开始运行时,event loop优先处理microtask queue,直到microtask queue为空的时候,再开始处理event queue。event queue不为空的话,一次取一个event执行,执行完后会重新判断microtask是否为空。
因此可以将处理完当前event之后,处理下一个event之前要做的,或者在处理所有event之前要做的事情放在microtask queue中。注意:绘制和交互等是放在event queue中,所以microtask queue中的任务不可以太耗时,否则会造成卡顿。
当两个queue都为空的时候,app正常退出。

之前说过的Future对象就是一个event,创建Future就会在event queue中添加一条记录,在async await中,被await标记的是一个event。

下面举个例子:
两个Future对象,在控制台输出字符串:

onPressed: () async {
   new Future((){print('future1');});
   new Future((){print('future2');});
}),

执行后的结果如图
69D25DB3-008B-442A-B223-453C86730DE7.png

这里两个Future就是两个事件,现在加入两个microtask事件也是输出字符串。

onPressed: () async {
   new Future((){print('future1');});
   Future.microtask(() {
    print('microtask1');
   });
   new Future((){print('future2');});
   Future.microtask(() {
    print('microtask2');
   });
}),

执行后的结果如图
844F21BD-FB44-4068-B8DA-96ACFE939982.png

可以看出event loop每次会先去处理microtask queue,microtask为空时候再去处理event queue。

猜你喜欢

转载自blog.csdn.net/github_33420275/article/details/88118808