1# 普通对象
2
3普通对象跨线程时通过拷贝形式传递,两个线程的对象内容一致,但是指向各自线程的隔离内存区间,被分配在各自线程的虚拟机本地堆(LocalHeap)。例如Ecmascript262规范定义的Object、Array、Map等对象是通过这种方式实现跨并发实例通信的。通信过程如下图所示:
4
5![deep_copy](figures/deep_copy.png)
6
7
8## 使用示例
9
10此处提供了一个传递普通对象的简单示例,具体实现如下:
11
12```ts
13// Test.ets
14// 自定义class TestA
15export class TestA {
16  constructor(name: string) {
17    this.name = name;
18  }
19  name: string = 'ClassA';
20}
21```
22
23```ts
24// Index.ets
25import { taskpool } from '@kit.ArkTS';
26import { BusinessError } from '@kit.BasicServicesKit';
27import { TestA } from './Test';
28
29@Concurrent
30async function test1(arg: TestA) {
31  console.info("TestA name is: " + arg.name);
32}
33
34@Entry
35@Component
36struct Index {
37  @State message: string = 'Hello World';
38
39  build() {
40    RelativeContainer() {
41      Text(this.message)
42        .id('HelloWorld')
43        .fontSize(50)
44        .fontWeight(FontWeight.Bold)
45        .alignRules({
46          center: { anchor: '__container__', align: VerticalAlign.Center },
47          middle: { anchor: '__container__', align: HorizontalAlign.Center }
48        })
49        .onClick(() => {
50          // 1. 创建Test实例objA
51          let objA = new TestA("TestA");
52          // 2. 创建任务task,将objA传递给该任务,objA非sendable对象,通过序列化传递给子线程
53          let task = new taskpool.Task(test1, objA);
54          // 3. 执行任务
55          taskpool.execute(task).then(() => {
56            console.info("taskpool: execute task success!");
57          }).catch((e:BusinessError) => {
58            console.error(`taskpool: execute task: Code: ${e.code}, message: ${e.message}`);
59          })
60        })
61    }
62    .height('100%')
63    .width('100%')
64  }
65}
66```