1# CommonLibrary子系统变更说明 2 3## cl.commonlibrary.1 taskpool传输Sendable数据行为变更 4 5**访问级别** 6 7其他 8 9**变更原因** 10 11taskpool执行并发任务,对于Sendable数据类型,以执行结果返回或sendData接口传输时,将Sendable数据的传输方式由克隆转为共享。考虑到taskpool任务执行后的数据再次使用的场景几乎不存在,从设计上也不推荐,因此从taskpool接口的易用性考虑,对默认的传输行为进行变更。 12 13**变更影响** 14 15此变更为非兼容变更 16变更前,使用API11的taskpool.Task.sendData接口发送或直接返回Sendable数据时,会默认拷贝一份。 17变更后,在该场景下,Sendable数据会共享传输,此时如果在主线程修改,子线程也会感知到变化。但是由于taskpool以任务维度执行,对一个对象的同时操作场景较少,后续的数据变化对taskpool的影响可控。 18如下代码,打印出来的值可能是100,也可能被子线程改成200: 19``` 20import { taskpool } from '@kit.ArkTS' 21@Sendable 22class A { 23 num: number = 100 24} 25@Concurrent 26async function foo(a: A) { 27 taskpool.Task.sendData(a) 28 a.num = 200 29} 30let a: A = new A() 31let task = new taskpool.Task(foo, a) 32task.onReceiveData((val: A) => { 33 console.log("num: " + val.num) 34}) 35``` 36 37**起始 API Level** 38 39Sendable接口从API 11起启用。 40 41**变更发生版本** 42 43从OpenHarmony SDK 5.0.0.18 开始。 44 45**变更的接口/组件** 46 47不涉及。 48 49**适配指导** 50 51如果不涉及taskpool执行sendData或者返回数据后仍然在两个线程分别读写同一个属性,则不需要适配。 52如果taskpool执行sendData或者返回数据后,如果宿主线程与子线程分别读写同一个属性,需要使用锁进行保护(从@arkts.utils导入)。 53当前代码: 54``` 55import { taskpool } from '@kit.ArkTS' 56@Sendable 57class A { 58 num: number = 100 59} 60@Concurrent 61async function foo(a: A) { 62 taskpool.Task.sendData(a) 63 a.num = 200 64} 65let a: A = new A() 66let task = new taskpool.Task(foo, a) 67task.onReceiveData((val: A) => { 68 console.log("num: " + val.num) 69}) 70``` 71为了保证class A的num域线程安全,需要增加同步保护,推荐改法: 72``` 73import { taskpool } from '@kit.ArkTS' 74@Sendable 75class A { 76 num: number = 100 77 async setNum(num: number) { 78 // add lock here 79 this.num = num 80 } 81 async getNum(): Promise<number> { 82 // add lock here 83 return this.num 84 } 85} 86@Concurrent 87async function foo(a: A) { 88 taskpool.Task.sendData(a) 89 a.setNum(200) 90} 91let a: A = new A() 92let task = new taskpool.Task(foo, a) 93task.onReceiveData((val: A) => { 94 console.log("num: " + val.getNum()) 95}) 96``` 97 98 99## cl.commonlibrary.2 taskpool.getTaskPoolInfo获取到的taskInfos中taskId的类型由BigInt变为number 100 101**访问级别** 102 103其他 104 105**变更原因** 106 107taskpool.getTaskPoolInfo获取到的taskInfos中taskId的大小选用number类型足够使用,不需要使用BigInt。 108 109**变更影响** 110 111此变更为非兼容变更 112变更前,taskId的类型为BigInt。 113变更后,taskId的类型为number。taskId是通过taskpool.getTaskPoolInfo获取到的TaskPoolInfo类中TaskInfo的成员,成员类型的变化不影响通过taskpool.getTaskPoolInfo接口获取其他属性,对开发者影响较小。 114 115当前代码: 116```ts 117import { taskpool } from '@kit.ArkTS' 118 119@Concurrent 120function delay(): void { 121 let start: number = new Date().getTime(); 122 while (new Date().getTime() - start < 500) { 123 continue; 124 } 125} 126 127let task1: taskpool.Task = new taskpool.Task(delay); 128let task2: taskpool.Task = new taskpool.Task(delay); 129let task3: taskpool.Task = new taskpool.Task(delay); 130taskpool.execute(task1, taskpool.Priority.LOW) 131taskpool.execute(task2, taskpool.Priority.MEDIUM) 132taskpool.execute(task3, taskpool.Priority.HIGH) 133let start: number = new Date().getTime(); 134while (new Date().getTime() - start < 1000) { 135 continue; 136} 137let taskpoolInfo: taskpool.TaskPoolInfo = taskpool.getTaskPoolInfo(); 138let taskId: number = 0; 139let taskIS = Array.from(taskpoolInfo.taskInfos) 140for(let taskInfo of taskIS) { 141 taskId = taskInfo.taskId; 142 console.info("taskpool---taskId is:" + taskId); 143} 144``` 145 146**起始 API Level** 147 148Sendable接口从API 11起启用。 149 150**变更发生版本** 151 152从OpenHarmony SDK 5.0.0.18 开始。 153 154**变更的接口/组件** 155 156taskpool.getTaskPoolInfo。 157 158**适配指导** 159 160定义taskId时类型为number。