本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。

Sendable 是 ArkTS 中用于实现数据在并发实例间传递的一种机制。Sendable 数据可以安全地在多线程之间共享,避免了数据竞争问题,并提高了并发编程的效率。

Sendable 协议的介绍

Sendable 协议定义了 ArkTS 的可共享对象体系及其规格约束。符合 Sendable 协议的数据(以下简称 Sendable 数据)可以在 ArkTS 并发实例间传递。
Sendable 数据的特点

  • 可序列化:Sendable 数据可以被序列化,以便在并发实例间传递。
  • 线程安全:Sendable 数据在并发实例间传递时,保证了数据的线程安全。
  • 共享或拷贝:Sendable 数据在并发实例间传递时,可以选择引用传递或拷贝传递。

    Sendable 数据在多线程中的引用与拷贝传递

    引用传递

  • Sendable 数据在并发实例间传递时,其引用会被复制。
  • 并发实例可以修改 Sendable 数据的内容,但这些修改不会影响其他并发实例。
    拷贝传递
  • Sendable 数据在并发实例间传递时,其内容会被复制。
  • 并发实例可以修改 Sendable 数据的内容,但这些修改不会影响其他并发实例的原始数据。

    引用传递与拷贝传递的选择

    选择引用传递还是拷贝传递取决于您的具体需求:

  • 引用传递:适用于数据量较小,且并发实例需要共享数据的情况。
  • 拷贝传递:适用于数据量较大,且并发实例需要独立操作数据的情况。

    Sendable 数据的创建与传输的代码实现

    以下是一个简单的示例,演示如何创建 Sendable 数据并将其传递到 TaskPool 中:

    import { taskpool } from '@kit.ArkTS';
    @Sendable
    class MyData {
      public value: number = 0;
      constructor(value: number) {
    this.value = value;
      }
    }
    async function processData(data: MyData) {
      data.value += 1;
      console.log(data.value);
    }
    async function main() {
      const data = new MyData(10);
      const task = new taskpool.Task(processData, data);
      await taskpool.execute(task);
    }
    @Entry
    @Component
    struct Index {
      @State message: string = 'Hello World';
      build() {
    Column() {
      Text(this.message)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .onClick(async () => {
          await main();
        })
        .width('100%');
    }
    .height('100%');
      }
    }

    这段代码定义了一个名为 Index 的组件,并在组件中显示了一条文本消息 "Hello World"。点击按钮会执行 main 函数,该函数创建一个 Sendable 对象并将其传递到 TaskPool 中。任务完成后,会在控制台输出修改后的数据值。

    Sendable 数据传递机制与普通数据传递机制对比

    特性Sendable 数据传递普通数据传递
    可序列化支持支持
    线程安全支持不支持
    共享或拷贝支持支持
    传递效率

    总结

    通过以上介绍,您可以了解到鸿蒙系统中 Sendable 数据的传递机制。Sendable 数据可以安全地在并发实例间传递,避免了数据竞争问题,并提高了并发编程的效率。希望本文能够帮助您掌握鸿蒙系统中的并发编程技术,并开发出更优秀的鸿蒙应用。


SameX
1 声望2 粉丝