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