Worker底层模型为Actor模型,本身线程间隔离,内存不共享。目前可以通过传输可共享对象SharedArrayBuffer达到内存共享的目的。
但需要注意,SharedArrayBuffer对象存储的数据在同时被修改时,需要通过原子操作保证其同步性,即下个操作开始之前务必需要等到上个操作已经结束。
参考代码如下:
1.在Index.ets中新建两个ThreadWorker。
import { worker } from '@kit.ArkTS';
@Component
export struct ThreadWorkerView {
build() {
Column() {
Button('测试Worker线程内存共享')
.width(200)
.onClick(() => {
let sab = new SharedArrayBuffer(32);
let i32a = new Int32Array(sab);
i32a[0] = 0;
let producer = new worker.ThreadWorker("entry/ets/pages/ThreadWorkerSharedArrayBuffer/WorkerProducer.ets");
producer.postMessage(sab);
let consumer = new worker.ThreadWorker("entry/ets/pages/ThreadWorkerSharedArrayBuffer/WorkerConsumer.ets");
consumer.postMessage(sab);
})
}
}
}
2.在 build-profile.json5的buildOption中添加字段。
"buildOption": {
"sourceOption": {
"workers": [
"./src/main/ets/pages/ThreadWorkerSharedArrayBuffer/WorkerProducer.ets",
"./src/main/ets/pages/ThreadWorkerSharedArrayBuffer/WorkerConsumer.ets"
]
}
},
3.编写worker_producer.ets脚本。
import { MessageEvents, worker } from '@kit.ArkTS';
const workerPort = worker.workerPort;
workerPort.onmessage = (e: MessageEvents): void => {
let i32a = new Int32Array(e.data);
console.info("Worker Producer: received sab");
setInterval(() => {
let length = i32a.length;
for (let i = 1; i < length; i++) {
i32a[i] = Math.random() * length;
}
Atomics.notify(i32a, 0, 1); // notify customer
}, 2000);
}
4.编写worker_consumer.ets脚本。
import { MessageEvents, worker } from '@kit.ArkTS';
const workerPort = worker.workerPort;
workerPort.onmessage = (e: MessageEvents): void => {
let i32a = new Int32Array(e.data);
console.info("Worker Customer: received sab");
while (true) {
Atomics.wait(i32a, 0, 0);
let length = i32a.length;
for (let i = length - 1; i > 0; i--) {
console.info("arraybuffer " + i + " value is " + i32a[i]);
i32a[i] = i;
}
}
}console.info("arraybuffer " + i + " value is " + i32a[i]); i32a[i] = i; } } }