任务执行队列
1、Dart任务的执行顺序
① 先执行MicroTask Queue中的MicroTask
② MicroTask Queue执行完之后,执行Event Queue中的Event
③ 每次都会判断是否有新的MicroTask和新的Event,优先执行MicroTask
2、MicroTask创建方法
① scheduleMicrotask(() {});
② Future.microtask(() {});
3、Event创建方法
async异步方法属于Event
Isolate
1、什么是Isolate
字面意思是隔离,即每个Isolate是独立的,隔离的,内存不共享的。
官方文档或注释的一部分:
All Dart code runs in an isolate, and code can access classes and values only from the same isolate.
所有的 Dart 代码运行在一个 Isolate 里,代码只能访问同一个 Isolate 里的类和值。
Different isolates can communicate by sending values through ports.
不同的 isolate 能够通过 port 发送值进行交流。
An isolate is what all Dart code runs in. It’s like a little space on the machine with its own, private chunk of memory and a single thread running an event loop.
所有 Dart 代码运行在一个 Isolate 里,它像机器上的一个小空间,有自己的私有内存块和运行事件循环的单个线程。
2、两种方式可以生成Isolate
① Isolate.spawn
② compute()
3、Isolate是如何实现内存隔离的
参考文章:[ Dart 中的
Isolate](https://links.jianshu.com/go?to=https://blog.csdn.net/joye123/article/details/102913497)
这里的内存指的就是堆内存,每个Isolate的堆内存是随着Isolate的创建而初始化。
4、Isolate之间的通信
DartVM支持的消息数据类型为:
① 原始数类型,如null、bool、double、int、String等
② SendPort实例,比如ReceivePort().sendPort
③ 包含①和②的list和map,也可以嵌套
④ 在DartVM中,处于同一进程的2个Isolate,也可以发送自定义的Class实例对象,但dart2js编译器不可以。
5、创建Isolate示例
① 创建Isolate
② 准备获取发送过来的数据
③ 将2边sendPort进行绑定
④ 创建监听,监听那边发过来的数据和SendPort
⑤ 开始往那边发送数据和SendPort
⑥ 等待那边处理数据
⑦ 监听到了那边发过来的数据和SendPort
⑧ 用拿到的数据进行大量的计算
⑨ 开始大量计算
⑩ 将计算完的数据发到那边
代码语言:txt复制import 'dart:async';代码语言:txt复制import 'dart:isolate';代码语言:txt复制import 'package:flutter/material.dart';代码语言:txt复制void main() {代码语言:txt复制 runApp(MyApp());代码语言:txt复制}代码语言:txt复制class MyApp extends StatelessWidget {代码语言:txt复制 @override代码语言:txt复制 Widget build(BuildContext context) {代码语言:txt复制 return MaterialApp(代码语言:txt复制 title: 'Flutter Demo',代码语言:txt复制 theme: ThemeData(代码语言:txt复制 primarySwatch: Colors.blue,代码语言:txt复制 ),代码语言:txt复制 home: HomePage(),代码语言:txt复制 );代码语言:txt复制 }代码语言:txt复制}代码语言:txt复制class HomePage extends StatelessWidget {代码语言:txt复制 const HomePage({Key? key}) : super(key: key);代码语言:txt复制 @override代码语言:txt复制 Widget build(BuildContext context) {代码语言:txt复制 return Scaffold(代码语言:txt复制 appBar: AppBar(),代码语言:txt复制 body: Column(代码语言:txt复制 children: [代码语言:txt复制 MaterialButton(代码语言:txt复制 color: Colors.red,代码语言:txt复制 onPressed: test,代码语言:txt复制 child: Text('测试'),代码语言:txt复制 ),代码语言:txt复制 ],代码语言:txt复制 ),代码语言:txt复制 );代码语言:txt复制 }代码语言:txt复制 void test() {代码语言:txt复制 asyncFibonacci(3).then((value) {代码语言:txt复制 print('执行:11'); // ----> 11. 拿到返回值代码语言:txt复制 print(value);代码语言:txt复制 });代码语言:txt复制 /*代码语言:txt复制 flutter: 执行:1代码语言:txt复制 flutter: 执行:2代码语言:txt复制 flutter: 执行:3代码语言:txt复制 flutter: 执行:4代码语言:txt复制 flutter: 执行:5代码语言:txt复制 flutter: 执行:6代码语言:txt复制 flutter: 执行:7代码语言:txt复制 flutter: 执行:8代码语言:txt复制 flutter: 执行:9代码语言:txt复制 flutter: 执行:9代码语言:txt复制 flutter: 执行:9代码语言:txt复制 flutter: 执行:9代码语言:txt复制 flutter: 执行:9代码语言:txt复制 flutter: 执行:10代码语言:txt复制 flutter: 执行:11代码语言:txt复制 flutter: 2代码语言:txt复制 */代码语言:txt复制 }代码语言:txt复制 /// 创建Isolate来计算斐波那契数列第n个数代码语言:txt复制 /// n从0开始代码语言:txt复制 Future<dynamic> asyncFibonacci(int n) async {代码语言:txt复制 /// 创建Isolate代码语言:txt复制 /// 创建一个ReceivePort代码语言:txt复制 /// Isolate所需参数,必须要有SendPort,SendPort需要ReceivePort创建代码语言:txt复制 final receivePort = ReceivePort();代码语言:txt复制 /// 第一个参数entryPoint:必须是一个顶层方法或静态方法代码语言:txt复制 /// 第二个参数message:通常初始化message包含一个sendPort代码语言:txt复制 print('执行:1'); // ----> 1. 创建Isolate代码语言:txt复制 await Isolate.spawn(_isolateTopLevelFunction, receivePort.sendPort);代码语言:txt复制 /// 获取sendPort来发送数据代码语言:txt复制 print('执行:2'); // ----> 2. 准备获取发送过来的数据代码语言:txt复制 final sendPort = await receivePort.first as SendPort;代码语言:txt复制 /// 接收消息的receivePort代码语言:txt复制 final answerReceivePort = ReceivePort();代码语言:txt复制 /// 发送数据代码语言:txt复制 print('执行:5'); // ----> 5. 开始往那边发送数据和SendPort代码语言:txt复制 sendPort.send([Calculate(count: n), answerReceivePort.sendPort]);代码语言:txt复制 /// 获取数据并返回代码语言:txt复制 print('执行:6'); // ----> 6. 等待那边处理数据代码语言:txt复制 return answerReceivePort.first;代码语言:txt复制 }代码语言:txt复制}代码语言:txt复制/// Isolate的顶级方法代码语言:txt复制void _isolateTopLevelFunction(SendPort sendPort) {代码语言:txt复制 final receivePort = ReceivePort();代码语言:txt复制 /// 绑定代码语言:txt复制 print('执行:3'); // ----> 3. 将2边sendPort进行绑定代码语言:txt复制 sendPort.send(receivePort.sendPort);代码语言:txt复制 /// 监听代码语言:txt复制 print('执行:4'); // ----> 4. 创建监听,监听那边发过来的数据和SendPort代码语言:txt复制 receivePort.listen((message) {代码语言:txt复制 print('执行:7'); // ----> 7. 监听到了那边发过来的数据和SendPort代码语言:txt复制 /// 获取数据并解析代码语言:txt复制 final data = message[0] as Calculate;代码语言:txt复制 final send = message[1] as SendPort;代码语言:txt复制 /// 返回结果代码语言:txt复制 print('执行:8'); // ----> 8. 用拿到的数据进行大量的计算代码语言:txt复制 int num = syncFibonacci(data.count);代码语言:txt复制 print('执行:10'); // ----> 10. 将计算完的数据发到那边代码语言:txt复制 send.send(num);代码语言:txt复制 });代码语言:txt复制}代码语言:txt复制/// 同步的斐波那契计算顶级方法代码语言:txt复制int syncFibonacci(int n) {代码语言:txt复制 print('执行:9'); // ----> 9. 开始大量计算代码语言:txt复制 return n < 2 ? n : syncFibonacci(n - 2) syncFibonacci(n - 1);代码语言:txt复制}代码语言:txt复制class Calculate {代码语言:txt复制 int count;代码语言:txt复制 Calculate({required this.count});代码语言:txt复制}


