鴻蒙程式設計江湖:ArkTS中Sendable資料在併發例項間的傳遞

SameX發表於2024-10-25

本文旨在深入探討華為鴻蒙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 資料可以安全地在併發例項間傳遞,避免了資料競爭問題,並提高了併發程式設計的效率。希望本文能夠幫助您掌握鴻蒙系統中的併發程式設計技術,並開發出更優秀的鴻蒙應用。

相關文章