文档管理中心
开发与测试开放能力API应用框架ArkTS(方舟编程语言)ArkTS并发并发线程间通信线程间通信对象普通对象

普通对象

本文导读

普通对象跨线程时通过拷贝(序列化)形式传递,两个线程的对象内容一致,但指向各自线程的隔离内存区间,被分配在各自线程的虚拟机本地堆(LocalHeap)。序列化支持类型包括:除Symbol之外的基础类型、Date、String、RegExp、Array、Map、Set、Object(仅限简单对象,比如通过"{}"或者"new Object"创建,普通对象仅支持传递属性,不支持传递其原型及方法)、ArrayBuffer、TypedArray。通信过程如图所示:

说明

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

使用示例

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

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