dart异步编程

dart是单线程 一定要记得很清楚
dart异步不同于java的线程,java线程是抢占式,但dart相当于开辟了一个新的进程的线程,不会对当前数据产生影响,也就没有所谓的锁 这是单线程的好处

Isolate机制 isolate一般不会在代码中直接使用

举个栗子:


image.png
import 'dart:isolate';

void main() {
  ReceivePort port = ReceivePort();
  Isolate.spawn(fun, port.sendPort);///固定写法
  port.listen((t) {///这里是设置当前receivePort 监听
    print("接收到其他isolate发过来的消息!");///这里接收了其他isolate发送的消息
    print(t);///接收到的为fun方法里面发送的消息
  });
}
void fun(SendPort sendPort) {
  var receivePort = new ReceivePort();
  var port = receivePort.sendPort;
  port.send("a");///发送消息
  sendPort.send("---");///发送消息
  receivePort.listen((t) {///这里是设置当前receivePort 监听
    print("接收到当前isolate发过来的消息!");///这里接收了当前发送的消息
    print(t);
  });
}
Isolate并行

Isolate相互之间不是会干扰的


image.png
image.png
import 'dart:isolate';
void main() {
  Isolate.spawn(i1, "");
  Isolate.spawn(i2, "");
}
void i1( msg) {
  print("isolate1 执行");
  Future.doWhile((){///Future代表未来要做的事情
    print("isolate1 future");
    return true;
  });
}
void i2( msg) {
  print("isolate2 执行");
  Future.doWhile((){///Future代表未来要做的事情
    print("isolate2 future");
    return true;
  });
}
Future

举个文件读取的栗子:


image.png
import 'dart:io';
void main() {
  new File(r"C:\Users\hp\Desktop\test.txt") ///在前面使用r 就可以不适用转义符号
      .readAsString()
      .then((t) {///then表示接下来要做的事情
    print(t);
    return "你好";///这里可以返回值 继续传给下一个then方法来使用
  }).then((t) {///这里继续使用then方法
    print(t);
  });
}
async await

async await 一般都是配合使用 他会阻塞 使其一步一步执行
继续举个文件读取的栗子:


image.png
import 'dart:io';
void main() {
  ful().then((t){
    print(t);
  });
}
Future<String> ful() async {
  String s1 = await new File(r"C:\Users\hp\Desktop\test.txt").readAsString();///这个执行完才能往下执行
  String s2 = await new File(r"C:\Users\hp\Desktop\test1.txt").readAsString();
  return "$s1\n$s2";
}
stream订阅模式
image.png

只能单个订阅,多个的话会报错

import 'dart:io';
void main() {
  Stream<List<int>> stream = new File(r"C:\Users\hp\Desktop\test.txt").openRead();
  stream.listen((_){
    print("订阅");
  });
  stream.listen((_){
    print("订阅");
  });
}

但是将他变成广播模式可以进行多订阅:

  var broadcastStream = stream.asBroadcastStream();
  broadcastStream.listen((_){
    print("订阅");
  });
  broadcastStream.listen((_){
    print("订阅");
  });
广播订阅

由单订阅转换而来的 : 和单订阅唯一的区别就是 允许多订阅

  var stream = Stream.fromIterable([1,2,3,4]);
  var broadcastStream = stream.asBroadcastStream();
  broadcastStream.listen((i){
    print("订阅者1:${i}");
  });
  broadcastStream.listen((i){
    print("订阅者2:${i}");
  });

需要注意的地方:直接创建广播,发送一条消息是不能接收到的

import 'dart:async';
void main(){
  var streamController = StreamController.broadcast();
  streamController.add("1");
  streamController.stream.listen((i){
    print("广播:"+i);
  });
  streamController.close();
}

记得关闭

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。