文档管理中心
您当前浏览的HarmonyOS 5.0.0(API 12)文档归档不再维护,推荐您使用最新版本。详细请参考文档维护策略变更

普通对象

本文导读

普通对象跨线程时通过拷贝形式传递,两个线程的对象内容一致,但是指向各自线程的隔离内存区间,被分配在各自线程的虚拟机本地堆(LocalHeap)。例如Ecmascript262规范定义的Object、Array、Map等对象是通过这种方式实现跨并发实例通信的。通信过程如下图所示:

说明

普通类实例对象跨线程通过拷贝形式传递,只能传递数据,类实例上的方法会丢失。可以使用@Sendable装饰器标识为Sendable类,类实例对象跨线程传递后,可携带类方法。

使用示例

此处提供了一个传递普通对象的简单示例,具体实现如下:

收起
自动换行
深色代码主题
复制
  1. // Test.ets
  2. // 自定义class TestA
  3. export class TestA {
  4. constructor(name: string) {
  5. this.name = name;
  6. }
  7. name: string = 'ClassA';
  8. }
收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { taskpool } from '@kit.ArkTS';
  3. import { BusinessError } from '@kit.BasicServicesKit';
  4. import { TestA } from './Test';
  5. @Concurrent
  6. async function test1(arg: TestA) {
  7. console.info("TestA name is: " + arg.name);
  8. }
  9. @Entry
  10. @Component
  11. struct Index {
  12. @State message: string = 'Hello World';
  13. build() {
  14. RelativeContainer() {
  15. Text(this.message)
  16. .id('HelloWorld')
  17. .fontSize(50)
  18. .fontWeight(FontWeight.Bold)
  19. .alignRules({
  20. center: { anchor: '__container__', align: VerticalAlign.Center },
  21. middle: { anchor: '__container__', align: HorizontalAlign.Center }
  22. })
  23. .onClick(() => {
  24. // 1. 创建Test实例objA
  25. let objA = new TestA("TestA");
  26. // 2. 创建任务task,将objA传递给该任务,objA非sendable对象,通过序列化传递给子线程
  27. let task = new taskpool.Task(test1, objA);
  28. // 3. 执行任务
  29. taskpool.execute(task).then(() => {
  30. console.info("taskpool: execute task success!");
  31. }).catch((e:BusinessError) => {
  32. console.error(`taskpool: execute task: Code: ${e.code}, message: ${e.message}`);
  33. })
  34. })
  35. }
  36. .height('100%')
  37. .width('100%')
  38. }
  39. }
在 指南 中进行搜索
请输入您想要搜索的关键词