美文网首页
Futter 练习 Isolate

Futter 练习 Isolate

作者: 卢融霜 | 来源:发表于2022-03-04 10:31 被阅读0次

    简介

    Dart 提供了 isolate, isolate与线程类似,isolate与线程的区别是 :线程与线程之间是共享内存的,而isolate与isolate之间是不共享内存的。
    async/await Future 也可实现异步操作,这种异步其实是运行在同一线程中并没有开启新的线程, 只是通过单线程的任务调度实现一个先执行其他的代码片段,等这边有结果后再返回的异步效果。

    关键字

    Isolate
    ReceivePort
    SendPort
    StreamSubscription
    Isolate.spawn
    Isolate.spawnUri
    StreamSubscription.cancel
    Isolate.kill

    演示代码

    import 'dart:async';
    import 'dart:isolate';
    
    void main(List<String> arguments) {
      isolateTest();
    }
    
    //异步调度
    
    void doWork(List list) {
      SendPort sendPort = list[0];
      print('--------------异步调度开始');
      ReceivePort receivePort = ReceivePort();
      SendPort sp = receivePort.sendPort;
      //传递给主线 发送对象,达到双向通信
      sendPort.send(sp);
      //监听对象
      StreamSubscription streamSubscription;
    
      streamSubscription = receivePort.listen((message) {
        print('--------------异步接收到消息 $message');
        if (message == -1) {
          print('--------------异步接收到-1 结束通信');
          streamSubscription?.cancel();
          return;
        }
        sendPort.send(message + 1);
      });
    }
    
    ///Isolate调度测试
    void isolateTest() async {
      //接收
      ReceivePort receivePort = ReceivePort();
      //发送
      SendPort sendPort = receivePort.sendPort;
    
      //调用异步
      Isolate isolate = await Isolate.spawn(doWork, [sendPort, '传递参数']);
      //异步发送对象
      SendPort workSendProt;
    
      //监听对象
      StreamSubscription streamSubscription;
      streamSubscription = receivePort.listen((message) {
        if (message is SendPort) {
          workSendProt = message;
          print('接收到异步发来的 sendProt');
          //开始通信
          workSendProt.send(1);
          return;
        }
        print('异步调度发来消息: $message');
        if (message >= 20) {
          //结束通信
          print('发起结束通信');
          workSendProt.send(-1);
          streamSubscription?.cancel();
          isolate.kill();
          return;
        }
        workSendProt.send(message + 1);
      });
    }
    
    

    运行结果

    --------------异步调度开始
    接收到异步发来的 sendProt
    --------------异步接收到消息 1
    异步调度发来消息: 2
    --------------异步接收到消息 3
    异步调度发来消息: 4
    --------------异步接收到消息 5
    异步调度发来消息: 6
    --------------异步接收到消息 7
    异步调度发来消息: 8
    --------------异步接收到消息 9
    异步调度发来消息: 10
    --------------异步接收到消息 11
    异步调度发来消息: 12
    --------------异步接收到消息 13
    异步调度发来消息: 14
    --------------异步接收到消息 15
    异步调度发来消息: 16
    --------------异步接收到消息 17
    异步调度发来消息: 18
    --------------异步接收到消息 19
    异步调度发来消息: 20
    发起结束通信
    --------------异步接收到消息 -1
    --------------异步接收到-1 结束通信
    
    Process finished with exit code 0
    

    相关文章

      网友评论

          本文标题:Futter 练习 Isolate

          本文链接:https://www.haomeiwen.com/subject/glwprrtx.html