5分钟了解Flutter线程Isolate的运用以及Isolate到底是怎样执行的

5分钟了解Flutter线程Isolate的运用以及Isolate到底是什么

  • Isolate在dart是什么
  • flutter线程内存隔离
  • Isolate的使用
    • 第一种,无参数
      • 使用Isolate.run
    • 第二种,有参数
      • 使用compute:
      • 使用Isolate.spawn
    • Isolate与外面线程通讯
    • Isolate以文件形式加载到内存运行
  • Isolate运用场景
  • Isolate到底是不是真的线程
  • 如何证明Isolate不是真的线程?

Isolate在dart是什么

Isolate中文的意思是“隔离”。用宏观角度来看,在dart使用Isolate,相当于使用线程。
我们来看看官方给出的解析:

"所有 Dart 代码都在isolate中运行,isolate与线程类似,但不同之处在于isolate有自己的isolate内存。 它们不以任何方式共享状态,只能通过消息传递进行通信。 默认情况下,Flutter 应用程序在单个isolate区(主isolate区)上完成所有工作。 在大多数情况
但有时,应用程序需要执行异常大的计算,这可能会导致“UI jank”(不稳定的运动)。 如果您的应用程序因此而遇到卡顿,您可以将这些计算移至辅助isolate中。 这允许底层运行时环境与主 UI isolate的工作同时运行计算,并利用多核设备。
每个isolate区都有自己的内存和事件循环。 事件循环按照事件添加到事件队列的顺序处理事件。 在主isolate区上,这些事件可以是任何事件,从处理用户在 UI 中点击、执行功能到在屏幕上绘制框架。 "

flutter线程内存隔离

我们从下面这张官方给出的图,可以发现Dart虚拟机与Android虚拟机截然不同的是,运行中的Isolate是内存独立的。
在这里插入图片描述
显而易见,Isolate的最大优势就是创建线程不需要对内存加锁,创建速度快,。并且垃圾回收不需要暂停其他业务线程,可以隔绝其他业务线程带来的内存抖动的影响,从而优化业务了帧率(不熟悉内存抖动,可以看看这篇文章<<Android内存抖动>>)。但是缺点也明显,内存不共享,通讯需要拷贝内容

Isolate的使用

第一种,无参数

使用Isolate.run

String runData = await Isolate.run(<String>() {
  return 'run ,run run';
});
print("Isolate.run:$runData");

运行结果:

Isolate.run:run ,run run

第二种,有参数

可以使用函数compute, 也可以使用Isolate.spawn

使用compute:

class Data {
  String value = 'data';
}

  String computeData = await compute((message) {
   print("compute>>:${message.value}");
   return 'kakakak';
 }, Data()..value = 'compute,compute');
 print("compute.run:$computeData");

运行结果:

Shell: compute>>:compute,compute
compute.run:kakakak

使用Isolate.spawn

 await Isolate.spawn((message) {
   print('Isolate.spawn:${message.value}');
 }, Data());

运行结果:

Shell: Isolate.spawn:data

Isolate与外面线程通讯

RawReceivePort相当于接收器,里面有个订阅回调,接收Isolate返回的数据

 final receivePort = RawReceivePort();
 receivePort.handler = (data) {
   print(data);
   if (data == 'close') {
     receivePort.close();
   }
 };
 Isolate.spawn((port) {
   var i = 0;
   while (i < 5) {
     port.send('create:${i++}');
   }
   port.send('close');
 }, receivePort.sendPort);

运行结果:

Shell: create:0
Shell: create:1
Shell: create:2
Shell: create:3
Shell: create:4
Shell: close

Isolate以文件形式加载到内存运行

提供个dart文件,然后使用Isolate.spawnUri这个方法加载这个文件执行。但是入口必须是如下

void main(List<String> args,SendPort sendPort){

}

下面提供完整的例子:
编写一个dart文件,名字可以任意取,这里叫做isloate_test.dart

import 'dart:convert';
import 'dart:isolate';

void main(List<String> args,SendPort sendPort){
  print(jsonEncode(args));
}


然后在其他dart文件加载

  ReceivePort receiveUriPort = ReceivePort();
 await Isolate.spawnUri(
    Uri(path: './isloate_test.dart'), ['a', 'b', 'c'], receiveUriPort.sendPort);

运行结果:

[‘a’, ‘b’, ‘c’]

Isolate运用场景

由于UI代码是在UI线程里面执行的,为了避免影响UI线程的运算,非UI的业务都建议使用其他线程来进行执行,以优化UI的流畅度
在这里插入图片描述

Isolate到底是不是真的线程

微观角度来看,Isolate真不是具体的线程,它只是dart运输到线程执行的一种包装载体。并且是放到系统的线程池里面执行的一种包装。
在这里插入图片描述
Isolate是由Dart VM Thread从系统里面进行创建来调度管理的。 Isolate类似Java的Runnable

如何证明Isolate不是真的线程?

很简单,你只需要跑到 点击>>isolate.cc<<的源码里面阅读一下就可以知道它是交给tread_pool线程池执行的。

//...
isolate->group()->thread_pool()->Run<SpawnIsolateTask>(isolate,
                                                         std::move(state));
//...

是不是很赞?如果这篇文章对你有帮助,请关注🙏,点赞👍,收藏😋三连哦

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

led显示屏用什么胶水封装比较好?

led显示屏用什么胶水封装比较好&#xff1f; LED显示屏通常使用特定的胶水进行封装&#xff0c;以确保其稳定性和耐用性。常见的用于LED显示屏封装的胶水类型包括有机硅灌封胶、环氧树脂灌封胶等。 有机硅灌封胶具有优异的耐高温、防水、绝缘和密封性能&#xff0c;非常适合用…

使用MATLAB/Simulink点亮STM32开发板LED灯

使用MATLAB/Simulink点亮STM32开发板LED灯-笔记 一、STM32CubeMX新建工程二、Simulink 新建工程三、MDK导入生成的代码 一、STM32CubeMX新建工程 1. 打开 STM32CubeMX 软件&#xff0c;点击“新建工程”&#xff0c;选择中对应的型号 2. RCC 设置&#xff0c;选择 HSE(外部高…

python菜鸟级安装手册-上篇

python安装教程 电脑-右键-属性&#xff0c;确认系统类型和版本号&#xff0c;比如本案例系统是64位 win10 点击python官网&#xff0c;进行下载 适用于 Windows 的 Python 版本 |Python.org 选择第一个安装程序64位即可满足需要&#xff0c; 嵌入式程序包是压缩包版本&…

MySQL中的ON DUPLICATE KEY UPDATE和REPLACE

在 MySQL 中&#xff0c;ON DUPLICATE KEY UPDATE 和 REPLACE 语句都可以用来处理插入数据时主键或唯一键冲突的情况&#xff0c;但它们在处理冲突的方式上有所不同。它们有以下区别&#xff1a; 行为方式&#xff1a; ON DUPLICATE KEY UPDATE&#xff1a;当插入的数据行存在冲…

【竞技宝】欧冠:多特淘汰大巴黎进决赛,姆巴佩迷失

多特蒙德在本赛季欧冠半决赛第二回合较量中,跟大巴黎队狭路相逢。赛前,大部分球迷和媒体都看好坐拥姆巴佩的大巴黎队,可以靠着主场作战的优势,逆转多特蒙德晋级欧冠决赛。大巴黎队主场作战确实创造出不少得分机会,只可惜球队运气有些差,射门都打在了多特蒙德横梁上。反观多特蒙…

双翻斗雨量计学习

双翻斗雨量计用户手册&#xff08;脉冲型&#xff09; 本仪器由雨量计壳体、承雨口、漏斗、翻斗支撑、上漏斗雨量调节支架、上漏斗、汇集漏斗、计数翻斗雨量调节支架、计数翻斗、干簧管安装架、轴承螺钉、出水漏斗、腿部支架、干簧管、水平泡、调节支撑板、控制盒、调平装置、接…

IaC实战指南:DevOps的自动化基石

基础设施即代码&#xff08;Infrastructure as Code&#xff0c;IaC&#xff09;是指利用脚本、配置或编程语言创建和维护基础设施的一组实践和流程。通过IaC&#xff0c;我们可以轻松测试各个组件、实现所需的功能并在最小化停机时间的前提下进行扩展。更值得一提的是&#xf…

算法基础01一快速排序,归并排序,二分

一.排序 1.快速 排序 基于分治 确定分界点 左 右 中间 随机划分区间 左半边<x >x在右半边递归处理左右两端 #include<iostream>using namespace std;const int N 1e6 10;int n; int q[N]; void quick_sort(int q[],int l,int r) {if(l>r)return;//边界&…

k8s 资源文件参数介绍

Kubernetes资源文件yaml参数介绍 yaml 介绍 yaml 是一个类似 XML、JSON 的标记性语言。它强调以数据为中心&#xff0c;并不是以标识语言为重点例如 SpringBoot 的配置文件 application.yml 也是一个 yaml 格式的文件 语法格式 通过缩进表示层级关系不能使用tab进行缩进&am…

怎么快速分享视频文件?用二维码看视频的方法

怎样不通过传输下载分享视频内容呢&#xff1f;以前分享视频内容&#xff0c;大多会通过微信、QQ、邮箱、网盘等形式来传递。但是这种方式需要下载后才可以观看&#xff0c;不仅占用手机内存&#xff0c;而且效率也比较低&#xff0c;所以现在很多人会采用视频生成二维码的方式…

Could not resolve placeholder ‘xx.xxx.host’ in value “xxx“问题解决

Could not resolve placeholder ‘xx.xxx.host’ in value "xxx"问题解决 众多原因其中之一 springboot 项目&#xff0c;idea 配置apollo 时&#xff0c;运行指定了配置文件 uat 所以使用本地配置文件启动 时&#xff0c;一直去找uat 配置文件&#xff0c;结果自…

树莓派4b测量光照强度

1.BH1750光照强度连接图 2. BH1750工作原理 BH1750的通讯过程 第1步:发送上电命令。 发送的过程和第2步基本一致,把测量命令(0x10)改成上电命令(0x01)。第2步:发送测量命令。 下面图片上的例子,ADDR引脚是接GND的,发送的测量命令是“连续高分辨率测量(0x10)”。 发送数据…

Android11 InputReader分析

InputReader线程主要负责读取输入数据&#xff0c;并把数据交给InputDispatcher线程。本文以多指触摸屏为例&#xff0c;梳理一下InputReader的流程。 InputReader线程主要完成以下工作&#xff1a; 处理已有的输入设备处理新增或者移除的输入设备对输入设备产生的输入数据进行…

【数据结构与算法】力扣 226. 翻转二叉树

题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a; root [4,2,7,1,3,6,9] 输出&#xff1a; [4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a; root [2,1,3] 输出&#xff1a; [2,3,1…

【算法刷题 | 贪心算法09】4.30(单调递增的数字)

文章目录 16.单调递增的数字16.1题目16.2解法&#xff1a;贪心16.2.1贪心思路16.2.2代码实现 16.单调递增的数字 16.1题目 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的…

项目1:STM32+DHT11+FreeRTOS+emwin+LCD

【屏幕显示DHT11数据】 面向对象的思想编写硬件驱动程序&#xff0c;DHT11采集环境中的温湿度数据。使用FreeRTOS提供的任务间通信、同步、互斥&#xff0c;将DHT11的数据传递给显示任务。显示任务中&#xff0c;使用emWin中间件&#xff0c;制作屏幕的各种界面&#xff0c;并将…

程序员必备的8款工具软件,第5款简直绝了!

没错&#xff0c;今天又送福利了&#xff01;来给大家推荐一波好用的软件~ 都说程序员的电脑上有各种各样的软件工具、编辑器、插件等等&#xff0c;不同岗位的程序员使用的工具也不同。 今天就给你分享8款程序员必备的工具软件&#xff0c;看看是不是你常用的&#xff01; …

【最经典的79个】软件测试面试题(内含答案)备战“金三银四”

001.软件的生命周期(prdctrm) 计划阶段(planning)-〉需求分析(requirement)-〉设计阶段(design)-〉编码(coding)->测试(testing)->运行与维护(running maintrnacne) 测试用例 用例编号 测试项目 测试标题 重要级别 预置条件 输入数据 执行步骤 预期结果 0002.问&…

锂电池管理芯片厂商拓品微电子授权世强硬创代理,产品涵盖充电/升压等系列

为进一步扩大自身品牌在国内的知名度&#xff0c;给更多硬科技企业提供锂电池管理芯片产品&#xff0c;南京拓品微电子有限公司&#xff08;下称“拓品微电子”&#xff0c;英文名&#xff1a;TOP POWER ASIC&#xff09;与拥有超30年历史的分销企业世强先进&#xff08;科技&a…

618热门好物大盘点,省心购物指南快看过来!

在618购物节即将拉开帷幕之际&#xff0c;整个互联网仿佛都弥漫着一种节日的热闹与期待。各大品牌纷纷亮出他们的杀手锏&#xff0c;推出了一系列诱人的优惠活动和特色产品&#xff0c;让人眼花缭乱&#xff0c;心动不已。如果你此刻正犹豫着该把哪一件宝贝收入囊中&#xff0c…