网站首页 > 博客文章 正文
Dart 是单线程的,不过呢,它通过事件循环和异步机制来处理并发的情况,而且还有 Isolate 能实现多线程。今天主要学习一下flutter如何线程管理的。
一 核心机制一:主厨与事件循环(单线程模型)
场景设定
o 主厨(主Isolate)独自负责所有订单(UI渲染、点击事件等)
o 工作台(事件循环)处理任务的优先级:
while (餐厅营业中) {
1. 立刻处理"加急单"(微任务队列):.then()回调、await
后续代码
2. 按顺序处理"普通单"(事件队列):点击事件、网络响应、文件读写
3.
抽空检查新订单(保持循环不阻塞)}典型问题
当主厨遇到需要剁10斤肉馅的任务(耗时同步操作):
void 处理订单() {
剁肉馅30分钟(); // 直接卡死工作台!
其他订单全部堆积 → 用户觉得应用卡死
}
二 核心机制二:帮厨系统(Isolate)
解决方案
o 主厨发现耗时任务 → 呼叫帮厨(新建Isolate)
o 帮厨特点:
o 有独立工作台(独立内存空间)
o 通过纸条沟通(消息传递)
o 完成后通过铃铛通知(SendPort回调)
// 主厨操作
void 开始剁肉() async {
final 帮厨 = await Isolate.spawn(_剁肉任务, 沟通管道.sendPort);
沟通管道.listen((消息) {
if (消息 is String) 更新UI("肉馅完成");
});
}
// 帮厨任务
static void _剁肉任务(SendPort 主厨收件箱) {
final 肉馅 = 疯狂剁肉30分钟();
主厨收件箱.send("完成啦!");
}
三 核心机制三:临时帮厨(compute函数)
简化版解决方案
对于一次性任务,使用官方提供的快捷方式:
void 快速处理() async {
final 结果 = await compute(剁肉函数, 10); // 自动创建+销毁Isolate
更新UI(结果);
}
四 线程管理核心三原则
4.1主厨永远不碰耗时活
UI相关操作必须在主Isolate完成,但所有耗时操作必须转交:
// 正确做法
ElevatedButton(
onPressed: () => compute(处理图片, 图片数据),
)
// 错误示范
ElevatedButton(
onPressed: () => 同步处理图片(), // 导致UI冻结
)
4.2帮厨之间不共享食材
Isolate之间通过 值拷贝 传递数据(避免内存竞争):
void main() {
var 调料 = '酱油';
Isolate.spawn((_){
print(调料); // 错误!无法访问主Isolate变量
}, null);
}
4.3 铃铛通信系统(SendPort)
跨Isolate通信必须通过消息机制:
// 主Isolate
ReceivePort 收件箱 = ReceivePort();
Isolate.spawn(帮厨任务, 收件箱.sendPort);
// 帮厨Isolate
static void 帮厨任务(SendPort 主厨邮箱) {
主厨邮箱.send('需要更多面粉');
}
五 实际开发中的线程策略
六 总结
为什么这种设计更高效?
1. 避免锁机制:Isolate内存独立,无需处理多线程锁
2. 降低死锁概率:消息传递机制天然隔离风险
3. 资源可控:每个Isolate可独立销毁(类似关停不忙的帮厨)
- 上一篇: Flutter TextField 边框样式以及提示文本
- 下一篇: Flutter——路由
猜你喜欢
- 2025-05-23 Flutter——路由
- 2025-05-23 Flutter TextField 边框样式以及提示文本
- 2025-05-23 Flutter缓存数据可以怎么做
- 2025-05-23 flutter软件开发笔记20-flutter web开发
- 2025-05-23 flutter软件开发笔记25-内置组件总结
- 2025-05-23 flutter软件开发笔记17-isolate的机制作用
- 2025-05-23 Flutter实战经验(十二):不同平台操作体验的差异和适配(一)
- 2025-05-23 Flutter GetX 硬核分享:Rx 扩展方法实践指南
- 2025-05-23 Flutter与Android iOS 的双向通信
- 2025-05-23 flutter软件开发笔记04-基本组件的使用解析
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- googlecloud (64)
- messagesource (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)