专业的编程技术博客社区

网站首页 > 博客文章 正文

flutter软件开发笔记18-线程管理

baijin 2025-05-23 15:15:39 博客文章 12 ℃ 0 评论

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可独立销毁(类似关停不忙的帮厨)

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表