FLutter里的“线程” 一文通关

前言

在Flutter中,启动一个新线程来处理任务通常是指在另一个隔离区(isolate)中执行代码。由于Dart使用单线程模型,它通过隔离区来实现并发。隔离区是独立的执行线程,不共享内存,通过消息传递来通信。这种方法可以用来运行长时间或资源密集型的任务,而不会阻塞主UI线程。

为什么Dart是单线程模型

Dart 的单线程模型避免了诸如线程同步、锁定、死锁和竞争条件等复杂问题,避免了线程间的资源冲突。

Dart 使用事件循环来管理事件和消息。这种机制类似于JavaScript的处理方式,允许执行环境管理大量的异步操作。Dart 的事件循环使得它在处理I/O密集型操作(如网络通信、文件操作等)时非常高效,因为它可以在等待这些操作完成时继续执行其他代码,从而不阻塞主线程。

虽然Dart是基于单线程模型,但它通过隔离区(独立的工作区域)支持并发执行。每个隔离区有自己的内存堆和事件循环,它们通过消息传递相互通信,这避免了传统多线程编程中常见的内存共享问题。这种模型在提供并发性的同时,还保持了代码的安全性和可维护性。

隔离区的并发不依赖于操作系统的进程调度,而是由Dart虚拟机(VM)控制。Dart VM 管理所有隔离区,并在可用的处理器核心之间调度它们的执行。

如何在flutter新建一个“线程”

定义一个函数,这个函数将在新的隔离区中运行。这个函数可以执行任何长时间运行的任务,比如数据库操作、文件处理等。

void doWork(SendPort sendPort) {// 执行一些长时间的任务sendPort.send("任务完成");
}

然后可以在Flutter应用中的任何位置启动一个新的隔离区,并传递上面创建的函数给它,同时还需要创建一个ReceivePort来接收来自隔离区的消息。

void startIsolate() async {// 创建一个ReceivePort用于接收来自隔离区的消息ReceivePort receivePort = ReceivePort();// 启动一个隔离区,并传递给它一个SendPortIsolate.spawn(doWork, receivePort.sendPort);// 监听来自隔离区的消息receivePort.listen((data) {print(data); // 输出从隔离区接收到的数据});
}

Future

在Dart中,Future是一个核心类,用于表示一个可能在未来某一时刻返回结果的异步操作。当执行一个耗时操作,如网络请求或文件读取时,这个操作将不会立即完成,并且其结果将在未来某个时刻可用。Future就是用来处理这种情况的。

Future<String> fetchData() {return Future.delayed(Duration(seconds: 4), () {return 'Data loaded';});
}

async和await

这两个关键字一起使用,简化了异步编程的复杂性,使得异步代码的书写和阅读更接近同步代码的风格。

  • async: 用于声明一个函数是异步的。它修改了函数的行为,使得函数返回一个Future。这意味着函数即使完成执行,其返回的结果也可能还不可用。

  • await: 用在异步函数(被async修饰的函数)内部,用来暂停执行当前的异步函数,直到某个异步操作完成并返回结果。await只能在async函数中使用。

将上面的fetchData函数与await一起使用,看看如何在实际代码中调用它:

Future<void> printData() async {String data = await fetchData(); // 等待fetchData函数的Future完成print(data); // 打印加载的数据
}

printData函数中,使用await关键字暂停执行,直到fetchDataFuture完成。这种方式使得异步代码的流程看起来像是同步的,便于理解和维护。

在Dart中,当使用asyncawait时,实际上是在当前的执行线程(通常是主线程)上调度异步任务。这些任务被安排在事件队列中,等待事件循环来处理。当一个异步操作(如网络请求、文件I/O等)被触发时,它会被排入事件循环,并在操作完成后的某个时刻返回结果,此时await会恢复函数的执行。

在Dart中,这种看似同时进行的操作实际上是通过事件循环(event loop)来实现的,这是一种典型的异步编程模式。

Dart 的单线程模型并不意味着它不能同时处理多个任务。实际上,Dart 使用一个叫做事件循环的系统来高效地管理单线程中的多个任务。这里的关键是任务被分为微任务(microtasks)和事件(events):

微任务(Microtasks):这些任务拥有高优先级,通常用于处理短暂且紧急的工作。微任务队列在事件队列之前执行,并且一旦开始,整个微任务队列会被执行完毕,直到没有微任务为止。

事件(Events):这些任务通常包括I/O操作,如网络请求、文件操作、定时器等。事件队列中的任务会在微任务队列为空时执行。

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

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

相关文章

JavaScript 自定义属性操作

在 JavaScript 中&#xff0c;可以使用自定义属性来存储与元素相关的数据。自定义属性允许开发人员在元素上存储任何类型的数据&#xff0c;包括字符串、数字、对象等。接下来&#xff0c;我将详细解析如何在 JavaScript 中操作自定义属性&#xff0c;并提供相应的代码示例。 …

四川农业大学Java实训项目圆满收官,汇智知了堂引领学子实践创新

近日&#xff0c;四川农业大学与汇智知了堂共同举办的Java实训项目正式迎来了项目汇报阶段。本次实训是汇智知了堂在高等教育领域深化校企合作、推动产教融合的一次重要实践&#xff0c;旨在为广大学子提供一个将理论知识与实际操作相结合的平台。 在实训过程中&#xff0c;汇…

cherry-markdown公式不好选中的问题

在我上一篇博客中&#xff0c;在解决公式插入预览无效之后&#xff0c;还f发现cherry-markdown是通过css的:hover来进行公式的展示&#xff0c;导致不好选中 上一篇博客速达&#xff1a;cherry-markdown公式能插入但是预览无效-CSDN博客 下面是解决方案&#xff0c;其实就是改…

selenium源码学习

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

vr数字成果展在线展示突破用户传统认知

想要轻松搭建一个充满互动与创意的3D数字展厅吗?vr互动数字展厅搭建编辑器将是您的不二之选!华锐视点3D云展平台提供的vr互动数字展厅搭建编辑器将空间重建与互动制作完美结合&#xff0c;让您轻松实现3D空间的搭建与互动营销制作。 在vr互动数字展厅搭建编辑器的帮助下&#…

ai语音机器人工作的原理流程电销机器人部署

ai机器人电销其实就相当于一个程序&#xff0c;可以代替人工进行一个电话外呼工作&#xff0c;可以模拟真人对话、智能回答客户问题。 其实机器人这个东西很早之前就已经有了&#xff0c;但是近几年&#xff0c;才被电销企业所应用。目前ai机器人电销已经取代了一部分人工&…

牛客题霸-SQL大厂面试真题(一)

本文基于前段时间学习总结的 MySQL 相关的查询语法&#xff0c;在牛客网找了相应的 MySQL 题目进行练习&#xff0c;以便加强对于 MySQL 查询语法的理解和应用。 由于涉及到的数据库表较多&#xff0c;因此本文不再展示&#xff0c;只提供 MySQL 代码与示例输出。 以下内容是…

抖店类目错放怎么办?怎么改类目?快速解决抖店类目错放问题

大家好&#xff0c;我是电商花花。 我们运营抖音小店的时候&#xff0c;都知道不要放错类目&#xff0c;也知道放错类目的后果&#xff0c;类目错放可能导致商品无法在正确的类目中展示&#xff0c;从而影响到商品的一个曝光率。 严重的话还被平台扣分&#xff0c;扣保证金&a…

隐藏服务器源IP怎么操作,看这一篇学会!

在当今的网络环境中&#xff0c;服务器作为信息和服务的中枢&#xff0c;常驻于公网之上&#xff0c;面临着各式各样的安全威胁&#xff0c;其中&#xff0c;分布式拒绝服务&#xff08;DDoS&#xff09;攻击尤为猖獗&#xff0c;它通过协调大量计算机同时向目标服务器发送请求…

跳绳步法汇总

跳绳步法 跳绳是一项多样化且富有乐趣的运动&#xff0c;拥有许多不同的步法和技巧。以下是一些常见的跳绳步法&#xff1a; 1. 基本步法 双脚并跳&#xff1a;双脚并拢一起跳&#xff0c;每次跳绳通过脚下时双脚同时离地。单脚跳&#xff1a;用一只脚跳&#xff0c;另一只脚…

设计一套Kafka到RocketMQ的双写+双读技术方案,实现无缝迁移!

设计一套Kafka到RocketMQ的双写双读技术方案&#xff0c;实现无缝迁移&#xff01; 1、背景2、方案3、具体逻辑 1、背景 假设你们公司本来线上的MQ用的主要是Kafka&#xff0c;现在要从Kafka迁移到RocketMQ去&#xff0c;那么这个迁移的过程应该怎么做呢&#xff1f;应该采用什…

JAVA开发面试超详细

一、Java 基础 1.JDK 和 JRE 有什么区别&#xff1f; jdk&#xff1a;java development kit jre&#xff1a;java runtime Environment jdk是面向开发人员的&#xff0c;是开发工具包&#xff0c;包括开发人员需要用到的一些类。 jre是java运行时环境&#xff0c;包括java虚拟机…

Selenium探险家:驾驭Web自动化的秘籍与实战

Hi&#xff0c;我是阿佑&#xff0c;今天将带大伙们学会如何使用Selenium进行高效的网站测试&#xff0c;如何配置Selenium Grid实现分布式测试&#xff0c;以及如何预测和拥抱自动化测试的未来&#xff01; 文章目录 1. 引言2. 背景介绍2.1 Selenium概览2.2 Python与Selenium的…

python数据可视化:自定义闭合区域填充颜色matplotlib.pyplot.fill()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 python数据可视化&#xff1a; 自定义闭合区域填充颜色 matplotlib.pyplot.fill() [太阳]选择题 以下关于matplotlib.pyplot.fill()函数说法正确的是&#xff1f; import matplotlib.pyplo…

【ARM+Codesys案例】T3/RK3568/树莓派+Codesys锂电叠片机方案:结合CODESYS实现高效生产

锂电叠片机解决方案 乘风破浪&#xff0c;促进新能源行业发展 锂电池是依靠锂离子在正极与负极之间移动来达到充放电目的的一种可充电电池&#xff0c;具有高能量密度、高电压、寿命长、无记忆效应等优点。锂电池属于国家政策扶持的高速发展行业&#xff0c;近年发展快速&…

【Beyond Compare】专业的文件对比工具

一、Beyond Compare官方下载 二、Beyond Compare简介 三、Beyond Compare 4激活 一、Beyond Compare官方下载 Beyond Compare官方下载 https://www.beyondcompare.cc/ Beyond Compare 4中文包 链接&#xff1a;https://pan.baidu.com/s/14igdUm0Xy7DFp4Jzb58AZg?pwdGLNG 提…

newinit.sh挖矿攻击处理与规避方案

目录 攻击分析 恢复措施&#xff1a; 问题排查 攻击入口分析 预防 临时处理方案&#xff1a; 攻击分析 攻击者&#xff1a;职业黑客&#xff08;99%&#xff09; 攻击方式&#xff1a;挖矿病毒newinit.sh和蠕虫病毒pnscan 中毒现象: 服务器负载异常&#xff0c;具体表…

CTFHUB技能树——SSRF(一)

目录 一、SSRF(服务器端请求伪造) 漏洞产生原理: 漏洞一般存在于 产生SSRF漏洞的函数&#xff08;PHP&#xff09;&#xff1a; 发现SSRF漏洞时&#xff1a; SSRF危害&#xff1a; SSRF漏洞利用手段&#xff1a; SSRF绕过方法&#xff1a; 二、CTFHUB技能树 SSRF 1.Ht…

结构体的偏移地址,首地址的宏计算

C语言的库函数中提供了计算结构体的一个元素在结构体中的偏移量&#xff0c;以及通过偏移量和结构体中元素的指针计算出来结构体的首地址。但是在一些场景没有办法使用C语言库中的函数&#xff0c;那么就需要自己进行定义。 如下面代码所示的两个宏定义就完成了计算结构体成员偏…

如何解决elment ui必填验证输入空格通过校验?

很久之前有个客户定制了一个ERP系统,里面有个单位的必填项,是没有任何规律的字符串,也就是只需要做必填即可,结果前段时间维护该信息的换了一个人,必填的单位居然是空白,因为数据缺失的原因导致后面一系列的工作流一个都提交不了,该员工意识到自己闯祸后直接跑路,联系不…