dart中的事件队列与微任务

        dart在每个事件循环中,会先执行同步任务代码,然后分别检查两个任务队列:微任务队列和事件队列。dart总是先执行微任务队列中的代码,然后才是事件队列中的代码。当两个队列中的任务都执行完成后,线程进入休眠状态, 等待下一次消息循环的到来。 

        事件队列(event queue),包含所有的外来事件:I/O、mouse events、drawing events、timers、isolate之间的信息传递。

        Future中的任务会加入下一轮的任务队列,then中的任务则是也会加入同样的任务队列。 Future中的任务和then后的任务可以理解为同步任务,因此,若Future嵌套微任务,会优先执行then中的代码, 然后分别是微任务队列中的代码、事件队列中的代码。

        当前事件循环中的微任务,会在这一轮中继续执行。当前事件循环中嵌套的Future中的代码, 才会在下一轮事件循环中执行。

         Future 是链式调用,意味着Future 的 then 未执行完,下一个then 不会执行。

        看一个简单的例子:

void testFuture(){print('外部代码1');Future(()=>print('A')).then((value) => print('A结束'));Future(()=>print('B')).then((value) => print('B结束'));scheduleMicrotask((){print('微任务A');});sleep(Duration(seconds: 1));print('外部代码2');
}

        打印结果:
        外部代码1
        外部代码2
        微任务A
         A
         A结束
         B
         B结束

        再看一个复杂点的例子:

void testFuture4(){Future x1 = Future(()=>null);x1.then((value){print('6');scheduleMicrotask(()=>print('7'));}).then((value) => print('8'));Future x = Future(()=>print('1'));x.then((value){print('4');Future(()=>print('9'));}).then((value) => print('10'));Future(()=>print('2'));scheduleMicrotask(()=>print('3'));print('5');
}

        打印结果:
        5,3,  6,8,7, 1,4,10,2  ,9

        注意: 8先于7执行,因为已经调度到了当前队列中,8在6之后是立刻执行的,而7是异步执行的。  
        注意: 9不是在10之后执行,因为9是在嵌套中下一层的队列中,因此需要等下一个消息循环才会执行。

        再看一个例子:

void testFuture() {Future f1 = new Future(() => print('f1'));Future f2 = new Future(() =>  null);Future f3 = new Future.delayed(Duration(seconds: 1) ,() => print('f2'));Future f4 = new Future(() => null);Future f5 = new Future(() => null);f5.then((_) => print('f3'));f4.then((_) {print('f4');new Future(() => print('f5'));f2.then((_) {print('f6');});});f2.then((m) {print('f7');});print('f8');
}

        执行顺序: f8 、f1 、f7 、f4、f6、f3、f5、f2

        因此可以解释:f4之后为什么直接是f6? 因为f2在前面已经执行过了,所以f6可以理解为一个同步任务,会被立刻执行。

        再看一个更复杂的例子:

void testScheduleMicrotatsk() {scheduleMicrotask(() => print('1'));
//1.0new Future.delayed(new Duration(seconds: 1), () => print('2'));
//2.0new Future(() => print('3')).then((_) {print('4');scheduleMicrotask(() => print('5'));}).then((_) => print('6'));
//3.0new Future(() => print('7')).then((_) => new Future(() => print('8'))).then((_) => print('9'));
//3.1      
//new Future(() => print('7'))
//      .then( (_) { new Future( () => print('8') );})
//      .then( (_) => print('9') ) ;
//4.0new Future(() => print('10'));scheduleMicrotask(() => print('11'));print('12');
}

        注意:如果按照3.0的写法, 执行完7后, 由于then是直接返回一个Future,而不是嵌套一个新Future,9将被阻塞, 因此执行顺序为:12、1、11、3、4 、6、5、7、10、8、9 、2

        3.0的写法等同于下述写法, then中是返回一个Future,而不是嵌套一个新的Future

new Future(() => print('7')).then( (_) { Future f = new Future( () => print('8') );return f;}).then( (_) => print('9') ) ;

        而如果是3.1的写法,则不会阻塞。 因为3.1这里then是嵌套了一个新的Future, 与then直接返回一个Future不同。 其执行顺序为12,1,11,3,4,6,5,7,9,10,8,2。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/715900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion WebUI API http://127.0.0.1:7860/docs空白

在尝试调用Stable Diffusion WebUI API的时候,打开http://127.0.0.1:7860/docs遇到了以下页面 网络诊断是这样的原因: 修bug,改来改去遇到了以下两种页面: 此时http://127.0.0.1:7860可以如下正常显示: 查资料的时候找…

vue+springboot项目部署服务器

项目仓库:vuespringboot-demo: vuespringboot增删改查的demo (gitee.com) ①vue中修改配置 在public文件夹下新建config.json文件: {"serverUrl": "http://localhost:9090"//这里localhost在打包后记得修改为服务器公网ip } 然后…

[NSSCTF 2nd] web复现

1.php签到 <?phpfunction waf($filename){$black_list array("ph", "htaccess", "ini");$ext pathinfo($filename, PATHINFO_EXTENSION);foreach ($black_list as $value) {if (stristr($ext, $value)){return false;}}return true; }if(i…

nginx 配置浏览器不缓存文件 每次都会从服务器 请求新的文件

目录 解决问题方法说明 测试html环境js环境第一步然后修改内容 打开带有js缓存的页面强制刷新 配置nginx 每次打开页面都会重新请求index.js 文件重启nginx再次修改index.js 总结设置为全局 解决问题 适用于实时更新数据的&#xff0c;网页 可以让用户每次都是重新请求&#x…

C语言中的套娃——函数递归

目录 一、什么是递归 1.1.递归的思想 1.2.递归的限制条件 二、举例体会 2.1.求n的阶乘 2.2.顺序打印整数的每一位 2.3.斐波那契数列 三、递归与迭代 一、什么是递归 在学习C语言的过程中&#xff0c;我们经常会跟递归打交道&#xff0c;什么是递归呢&#xff1f;它其实…

LNMP 架构

环境准备&#xff1a;lnmp 需要安装 nginx mysql php 论坛/博客 软件 使用LNMP架构搭建 论坛 1. 关闭防火墙和和核心防护 systemctl disable --now firewalld setenforce 0 2. 编译安装 nginx 安装依赖包 yum -y install pcre-devel zlib-devel gcc gcc-c make 创建…

Compiling from source on UNIX(cmake doxygen ant maven ccache)

前言 源码链接 cmake-3.18.0 https://cmake.org/files/v3.18/cmake-3.18.0.tar.gzdoxygen-1.10.0 https://www.doxygen.nl/files/doxygen-1.10.0.src.tar.gzapache-ant-1.10.8-bin https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.8-bin.tar.gzapache-maven-3…

#WEB前端(表单)

1.实验&#xff1a; form、input、label 登录界面&#xff0c;表单填写界面 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; 4.代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&q…

RedisTemplate中opaForValue.set的注意之处

问题 原本写了一个小项目&#xff0c;想通过redis缓存实现登录退出功能&#xff0c;结果出现了莫名奇妙的问题 代码如下&#xff1a; 报错&#xff1a; 经过多次调试之后我发现是opsForValue.set(key,value,expireTime)这行代码的问题&#xff0c;没有指定过期时间的单位&…

备战蓝桥杯---动态规划之悬线法

Em...属于一知道就会&#xff0c;不知道的话比较难想。 我们先看题&#xff1a; 我们不妨把1抽象成一个平面上的点&#xff0c;因此可以变成这一幅图&#xff1a; 我们假设每一个点被向上牵拉了一根线&#xff1a; 显然&#xff0c;每一条悬线都有可能成为边界限制&#xff0c…

Bulingbuling - 《历史的教训》 [ The Lessons of History ]

《历史的教训》 两位当代最伟大思想家的著名论文集&#xff0c;汇集了 5000 多年的历史 作者&#xff1a;威尔-杜兰特和阿里尔-杜兰特 The Lessons of History The celebrated collection of essays compiling over 5,000 years of history by two of the greatest thinkers …

Spring Boot项目中不使用@RequestMapping相关注解,如何动态发布自定义URL路径

一、前言 在Spring Boot项目开发过程中&#xff0c;对于接口API发布URL访问路径&#xff0c;一般都是在类上标识RestController或者Controller注解&#xff0c;然后在方法上标识RequestMapping相关注解&#xff0c;比如&#xff1a;PostMapping、GetMapping注解&#xff0c;通…

Siamrpn++论文中文翻译(详细!)

SiamRPN: Evolution of Siamese Visual Tracking with Very Deep Networks SiamRPN&#xff1a;具有非常深度网络的Siamese视觉跟踪的进化 【siamrpn论文地址】 https://arxiv.org/abs/1812.11703 摘要 基于Siamese网络的跟踪器将跟踪表示为目标模板和搜索区域之间的卷积特征…

【STA】多场景时序检查学习记录

单周期路径 建立时间时序检查 在时钟的有效沿到达触发器之前&#xff0c;数据应在一定时间内保持稳定&#xff0c;这段时间即触发器的建立 时间。满足建立时间要求将确保数据可靠地被捕获到触发器中。 建立时间检查是从发起触发器中时钟的第一个有效沿到捕获触发器中时钟后面…

基于springboot+vue的社区医院管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

chatgpt-3的文章生成器有哪些?可以批量生成文章的生成器

GPT-3&#xff08;Generative Pre-trained Transformer 3&#xff09;作为人工智能领域的一项重大突破&#xff0c;开启了新一代的文本生成技术。同时市面上也涌现出了一些GPT-3文章生成器&#xff0c;为用户提供了快速、高效地生成各种类型文章的工具。本文将介绍一些中国的GP…

python笔记_程序流程控制

A&#xff0c;顺序控制 程序从上到下逐行执行 python定义变量时&#xff0c;会合法地向前引用 age 1 age2 age 1 age2 age 1 age 1 ——>错误&#xff0c;age应在age2之前 B&#xff0c;分支控制 1&#xff0c;单分支if 语法 if 条件表达式 &#xff1a; 代码块 说明…

数字化转型导师坚鹏:证券公司数字化思维升级之道

证券公司数字化思维升级之道 ——数字化思维之六脉神剑 课程背景&#xff1a; 很多证券公司存在以下问题&#xff1a; 不知道数字化转型如何改变思维模式&#xff1f; 不清楚需要建立什么样的数字化思维&#xff1f; 不知道如何开展数字化思维提升工作&#xff1f; 课…

Redis之十:Spring Data Redis --- CrudRepository方式

SpringData Redis CrudRepository方式 Spring Data Redis 的 CrudRepository 是 Spring Data 框架中用于提供基础 CRUD&#xff08;创建、读取、更新和删除&#xff09;操作的一个接口。在与 Redis 集成时&#xff0c;尽管 Redis 是一个键值存储系统&#xff0c;并没有像关系型…

关于福彩历史数据采集器和体彩历史数据采集器的下载安装说明

前段时间因为研究基于人工神经网络&#xff08;深度学习&#xff0c;所谓的“AI”算法&#xff09;对3D开奖数据进行预测&#xff0c;开发了两款浏览器插件----“福彩历史数据采集器”和“体彩历史数据采集器”。之所以开发这两款插件&#xff0c;是因为不管是基于什么样的方式…