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。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值