40分钟快速入门Dart基础(下)

本文详细介绍了Dart的异步处理,包括单线程模型、isolate的概念和作用,以及Future和Stream的使用,帮助开发者理解Dart如何处理异步操作和并发。此外,还探讨了async/await关键字的使用以及泛型和异常处理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

40分钟快速入门Dart基础(下)

本章是对Dart 基础讲解的最后一章:我们讲解余下来的异步、泛型、异常,相对来说余下来的这三章稍微有点难度,但是小伙伴只要用心跟着我一起学习,应该问题不,如果有问题也可以在下方留言或者私信我。好废话不多说直接进入如主题:

Dart目录

一、前言:

对于已经叱咤开发武林已久的开发人员来讲,异步是一个很深的知识点。而我们在接触的每种语言里面基本上都会提到异步,同样地在使用Dart开发项目过程中,也是会有异步操作的。

我们在Java , oc中可以使用线程来实现异步操作,但是Dart是单线程模型,想要实现异步操作的话,我们可以使用事件队列来处理。

重点:Dart是单线程模型语言,也就没有了所谓的主线程/子线程之分。所以相对来说Dart线程理解起来和学习起来是相对容易的。

再这里首我们要想理解Dart单线程模型,首先我们理解什么是Even-Looper,Event-Queue

下面我们先来看一张图

从上图我们可以看出:Event Loop就是从EventQueue中获取Event、处理Event一直到EventQueue为空为止,而EventQueue小伙伴们可以看作成一个管道,Events 就是管道中每一个事件。可能说事件大家还是有点模糊那我们直接说是:用户的输入、文件IO、网络请求、按钮的点击这些都可以说成Event。

下面我们来说说单线程模型:

重点:只要Dart函数开始执行,它将会执行到这个函数结束,也就是说Dart的函数不会被其他Dart代码打断。

所以在Dart中引入一个关键词名叫:isolate 那什么叫:isolate 首先从字面上来看是”隔离“每个isolate都是隔离的,并不会共享内存。isolate是通过在通道上传递消息来通信,这就标识了Dart从性能上大大所有提升。不像其它语言(包括Java、Kotlin、Objective-C和Swift)都使用抢占式来切换线程。每个线程都被分配一个时间分片来执行,如果超过了分配的时间,线程将被上下文切换抢占。但是如果在线程间共享的资源(如内存)正在更新时发生抢占,则会导致竞态条件。

import 'dart:core';
import 'dart:isolate';

int i;

void main() {
    i = 10;
    //创建一个消息接收器
    ReceivePort receivePort = new ReceivePort();
    //创建isolate
    Isolate.spawn(isolateMain, receivePort.sendPort);

    //接收其他isolate发过来的消息
    receivePort.listen((message) {
        //发过来sendPort,则主isolate也可以向创建的isolate发送消息
        if (message is SendPort) {
            message.send("好呀好呀!");
        } else {
            print("接到子isolate消息:" + message);
        }
    });
}

/// 新isolate的入口函数
void isolateMain(SendPort sendPort) {
    // isolate是内存隔离的,i的值是在主isolate定义的所以这里获得null
    print(i);

    ReceivePort receivePort = new ReceivePort();
    sendPort.send(receivePort.sendPort);


    // 向主isolate发送消息
    sendPort.send("去大保健吗?");


    receivePort.listen((message) {
        print("接到主isolate消息:" + message);
    });
}
复制代码

可以看到代码中,我们接收消息使用了listene函数来监听消息。假设我们现在在main方法最后加入sleep休眠,会不会影响listene回调的时机?

import 'dart:io';
import 'dart:isolate';

int i;

void main() {
    i = 10;
    //创建一个消息接收器
    ReceivePort receivePort = new ReceivePort();
    //创建isolate
    Isolate.spawn(isolateMain, receivePort.sendPort);

    //接收其他isolate发过来的消息
    receivePort.listen((message) {
        //发过来sendPort,则主isolate也可以向创建的isolate发送消息
        if (message is SendPort) {
            message.send("好呀好呀!");
        } else {
            print("接到子isolate消息:" &#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值