Futter 练习 Isolate

2022-03-04  本文已影响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
上一篇 下一篇

猜你喜欢

热点阅读