美文网首页
Isolate线程通信

Isolate线程通信

作者: 温水煮青蛙a | 来源:发表于2023-03-10 20:56 被阅读0次

    Isolate.spawn 创建形式

    子线程返回数据到主线程

    • 主线程不需要回传数据给子线程
    void function_main() async {
        print("当前线程:"+ Isolate.current.debugName);
        // 声明ReceivePort对象用来监听回调的数据
        var receivePort = new ReceivePort();
        // 两个isolate之间通过SendPort来进行通信
        Isolate childIsolate = await Isolate.spawn(entryPoint, "就是entryPoint方法中接受的参数");
        /* 接收方式 1 */
        // 意思是第一次接收到消息,msg 就是子线程发送过来的数据
        String msg = await receivePort.first;
        
        /* 接收方式 2 */
        receivePort.listen((message) {
          //msg 就是子线程发送过来的数据
          String msg = message;
          // 关闭监听
          receivePort.close();
          //杀死线程资源
          childIsolate.kill();
        });
      }
      void entryPoint(String str) async {
        // 这里把回传的数据send回主线程
        sendPort.send("将数据发送到主线程 + ${str}");
      }
    

    子线程和主线程之间通信

    • 子线程返回数据到主线程后-主线程再次返回数据到子线程
    void function_main() async {
        print("当前线程:"+ Isolate.current.debugName);
        // 声明ReceivePort对象用来监听回调的数据
        var receivePort = new ReceivePort();
        // 两个isolate之间通过SendPort来进行通信
        await Isolate.spawn(entryPoint, receivePort.sendPort);
        /* 接收方式 1 */
        // 意思是第一次接收到消息
        SendPort sendPort = await receivePort.first;
        // 用子线程发送过来的SendPort对象-发送数据,-》子线程就会收到通知
        sendPort.send("回复给子线程的内容");
        /* 接收方式 2 */
        receivePort.listen((message) {
          SendPort sendPort = message;
          // 用子线程发送过来的SendPort对象-发送数据,-》子线程就会收到通知
          sendPort.send("回复给子线程的内容");
          // 关闭监听
          receivePort.close();
        });
      }
      void entryPoint(SendPort sendPort) async {
        // 创建跟当前线程关联的ReceivePort对象
        var port = new ReceivePort();
        // 把SendPort对象发送到主线程
        sendPort.send(port.sendPort);
        // 这里是接收到 主线程给回复的内容
        await for (var data in port) {
          print("data $data");
        }
      }
    

    Isolate.spawnUri 创建形式

    mainIsolate.dart文件中

    import 'dart:isolate';
    
    main() {
      //启动应用
      start();
      //创建新线程
      newIsolate();
      //项目初始化
      init();
    }
    
    void start(){
      print("启动应用" + DateTime.now().microsecondsSinceEpoch.toString());
    }
    
    void newIsolate() async {
      print("创建新线程");
      ReceivePort r = ReceivePort();
      SendPort p = r.sendPort;
      //创建新线程
      Isolate childIsolate = await Isolate.spawnUri(
          Uri(path: "childIsolate.dart"),//这里引用的是文件路径
          ["data1", "data2", "data3"],//这里传参就是文件方法中接收到args
          p);//这里的p就是文件方法中接收的SendPort对象
      r.listen((message) {
        print("主线程接收到数据:" + message[0]);
        if (message[0] == 0){
          //异步任务开始
        } else if (message[1] == 1){
          //异步任务正在处理
        } else if (message[2] == 2){
          //异步任务完成
          //取消监听
          r.close();
          //杀死新线程,释放资源
          childIsolate.kill();
        }
      });
    }
    
    void init() {
      print("项目初始化");
    }
    
    

    childIsolate.dart文件中

    import 'dart:io';
    import 'dart:isolate';
    
    main(List<String> args, SendPort mainSendPort) {
      print("新线程接收到的参数:$args");
      //发送数据到主线程
      mainSendPort.send(["开始异步操作", 0]);
      //延时3秒
      sleep(Duration(seconds: 3));
      //发送数据到主线程
      mainSendPort.send(["加载中", 1]);
      //延时3秒
      sleep(Duration(seconds: 3));
      //发送数据到主线程
      mainSendPort.send(["异步任务完成", 2]);
    }
    

    相关文章

      网友评论

          本文标题:Isolate线程通信

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