dart线程学习讲解

简介: Dart是一种基于对象的编程语言,其线程底层原理主要涉及两个方面:内存管理和并发执行。

Dart是一种基于对象的编程语言,其线程底层原理主要涉及两个方面:内存管理和并发执行。


在内存管理方面,Dart使用自动内存管理机制,即垃圾回收。Dart的垃圾回收算法主要有标记清除、标记整理和分代收集三种方式。其中,标记清除算法通过遍历对象图形来标记不再使用的对象,并将它们从内存中释放;标记整理算法则是先标记出所有活着的对象,然后将它们向一端移动以便于空闲内存与活跃内存的划分;而分代收集算法则根据对象的生命周期将内存划分为几个区域,对这些区域采用不同的回收策略。


在并发执行方面,Dart支持多线程和异步编程。Dart的多线程使用Isolate实现,每个Isolate拥有独立的内存空间和事件循环。Dart还提供了Future和Async/await两种异步编程方式,可以让开发者方便地进行非阻塞式的操作。


总的来说,Dart的线程底层原理基于自动内存管理机制和多线程/异步编程,具有高效、灵活、可靠等特点,是一门支持异步和并发编程的语言,它提供了多种线程和协程的实现方式。下面从浅入深介绍 Dart 的线程相关知识。

1. 单线程模型

Dart 是一门单线程语言,所有的代码都运行在一个单独的主线程中。这个主线程又被称为 UI 线程或者事件循环线程,因为它不仅负责执行 Dart 代码,还要处理各种事件(比如鼠标点击、键盘输入等)和更新 UI。


例如,下面是一个简单的 Dart 程序,它会输出一条消息并等待用户输入:

import'dart:io';
voidmain() {
print('请输入一些文本:');
Stringtext=stdin.readLineSync();
print('你输入的是:$text');
}

在这个程序中,所有代码都运行在主线程中,包括读取用户输入的操作。当程序执行到 stdin.readLineSync() 这一行时,主线程就会阻塞,等待用户输入完成后才会继续执行下去。

2. 异步编程

虽然 Dart 是一门单线程语言,但是它提供了多种异步编程的方式,可以让我们编写出高效、非阻塞的程序。下面分别介绍其中几种方式:

2.1. Future 和 async/await

在 Dart 中,我们可以使用 Future 和 async/await 来实现异步编程。Future 表示一个异步操作的结果,可以用来处理网络请求、文件读写等 I/O 操作。async/await 则是一种语法糖,可以让我们以同步的方式编写异步代码。

例如,下面是使用 Future 和 async/await 实现的与上面相同功能的程序:

import'dart:io';
voidmain() async {
print('请输入一些文本:');
Stringtext=awaitstdin.readLine();
print('你输入的是:$text');
}

在这个程序中,我们用 async 声明了 main 函数是一个异步函数,然后使用 await 等待用户输入完成。当主线程遇到 await 这一行时,它会暂时中断当前函数的执行,并去执行其他任务,直到异步操作完成后再恢复执行。

2.2. Stream 和 StreamBuilder

除了 Future,Dart 还提供了另外一种异步编程的方式——Stream。Stream 表示一个数据序列,可以用来处理一些需要持续接收数据的场景,比如 WebSocket、TCP 连接等。

对于 Stream,我们可以使用 StreamBuilder 来构建 UI,它可以自动更新 UI 的状态,从而让界面呈现出最新的数据。例如,下面是一个简单的例子,它每隔 1 秒钟输出一个数字:

import'dart:async';
import'package:flutter/material.dart';
voidmain() {
runApp(MyApp());
}
classMyAppextendsStatelessWidget {
@overrideWidgetbuild(BuildContextcontext) {
returnMaterialApp(
home: Scaffold(
body: Center(
child: StreamBuilder<int>(
stream: _getStream(),
builder: (context, snapshot) {
if (snapshot.hasData) {
returnText('${snapshot.data}', style: TextStyle(fontSize: 32));
              } else {
returnCircularProgressIndicator();
              }
            },
          ),
        ),
      ),
    );
  }
Stream<int>_getStream() {
returnStream.periodic(Duration(seconds: 1), (num) =>num).take(10);
  }
}

在这个程序中,我们使用 Stream.periodic 来创建一个每隔 1 秒钟发送一次数据的 Stream,然后使用 StreamBuilder 来将数据渲染到 UI 上。当 Stream 发送新的数据时,StreamBuilder 就会自动更新 UI 的状态。

3. Isolate

虽然 Dart 是一门单线程语言,但是它提供了 Isolate 来支持多线程编程。一个 Isolate 就是一个独立的运行环境,它有自己的内存空间、堆栈和指令计数器,可以并行地执行代码。

在 Dart 中,我们可以使用 Isolate.spawn() 来创建一个新的 Isolate,例如:

import'dart:isolate';
voidmain() async {
ReceivePortreceivePort=ReceivePort();
Isolateisolate=awaitIsolate.spawn(_entryPoint, receivePort.sendPort);
print('Isolate 已经启动');
}
void_entryPoint(SendPortsendPort) {
print('Isolate 开始运行');
}

在这个程序中,我们先通过 ReceivePort 创建了一个端口,然后通过 Isolate.spawn() 创建了一个新的 Isolate,并将这个端口的发送端口作为参数传递给它。创建成功后,主线程就会继续向下执行,而新的 Isolate 则会开始执行 _entryPoint 函数。

需要注意的是,不同的 Isolate 之间无法直接共享数据,它们只能通过消息传递来进行通信。例如,我们可以在主线程中向另外一个 Isolate 发送一条消息:

import'dart:isolate';
voidmain() async {
ReceivePortreceivePort=ReceivePort();
Isolateisolate=awaitIsolate.spawn(_entryPoint, receivePort.sendPort);
print('Isolate 已经启动');
receivePort.listen((message) {
print('接收到消息:$message');
  });
isolate.sendPort.send('你好,我是主线程!');
}
void_entryPoint(SendPortsendPort) {
print('Isolate 开始运行');
sendPort.send('你好,我是 Isolate!');
}

在这个程序中,我们通过 sendPort 发送了一条消息给新创建的 Isolate,并通过 receivePort 监听来自主线程的消息。当 Isolate 接收到消息时,它会打印出来,并通过 sendPort 回复一条消息给主线程。

以上就是 Dart 的线程相关知识的简单介绍和代码示例。需要注意的是,在使用多线程编程时,我们需要格外注意线程安全性和数据同步等问题,以避免出现不可预期的错误。

相关文章
|
4月前
|
Dart 编译器 API
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
|
4月前
|
Dart API C语言
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
Dart ffi 使用问题之想在C/C++中创建异步线程来调用Dart方法,如何操作
|
JSON Dart JavaScript
Dart线程全面系统学习
Java和OC都是多线程模型的编程语言,任意一个线程触发异常且该异常未被捕获时,就会导致整个进程退出。但Dart和JavaScript不会,它们都是单线程模型,运行机制很相似(但有区别)。 Dart在单线程中是以消息循环机制来运行的,其中包含两个任务队列,一个是“微任务队列” microtask queue,另一个叫做“事件队列” event queue。微任务队列的执行优先级高于事件队列。
Dart线程全面系统学习
|
Dart 调度 Android开发
Flutter 95: 图解 Dart 单线程实现异步处理之 Task Queue
0 基础学习 Flutter,第九十五节:学习一下 MicroTask 和 EventTask 任务调度!
517 0
Flutter 95: 图解 Dart 单线程实现异步处理之 Task Queue
|
Dart
Flutter 93: 图解 Dart 单线程实现异步处理之 Isolate (二)
0 基础学习 Flutter,第九十三步:补充学习 Flutter Isolate 的 compute() 方式!
769 0
Flutter 93: 图解 Dart 单线程实现异步处理之 Isolate (二)
|
Dart Android开发
Flutter 92: 图解 Dart 单线程实现异步处理之 Isolate (一)
0 基础学习 Flutter,第九十二步:了解基本的 Isolate 用法 (一)!
1451 0
Flutter 92: 图解 Dart 单线程实现异步处理之 Isolate (一)
|
Dart 前端开发 编译器
Flutter 91: 图解 Dart 单线程实现异步处理之 Future (二)
0 基础学习 Flutter,第九十一步:简单学习 Future 实现异步的基本操作 async-await!
485 0
Flutter 91: 图解 Dart 单线程实现异步处理之 Future (二)
|
Dart Java
Flutter 90: 图解 Dart 单线程实现异步处理之 Future (一)
0 基础学习 Flutter,简单学习 Future 实现异步的基本操作!
1305 0
|
JavaScript 前端开发 大数据
7月20日云栖精选夜读丨聊一聊Flutter Engine线程管理与Dart Isolate机制
Flutter是一款开源的移动跨平台UI开发套件,它不仅与现存的Native代码兼容,还能帮你用Dart语言快速开发高质量的跨平台App
4578 0
|
Android开发 iOS开发 异构计算
聊一聊Flutter Engine线程管理与Dart Isolate机制
Flutter是一款开源的移动跨平台UI开发套件,它不仅与现存的Native代码兼容,还能帮你用Dart语言快速开发高质量的跨平台App。
5135 0