鸿蒙 harmonyos 线程 并发 总结 async promise Taskpool woker(四)多线程并发 Worker管理

上一篇文章讲了Worker的基本用法

今天继续Worker

Worker的销毁

Worker(worker总是打错成woker纯手打,希望大家见谅)由于Worker一旦被创建则不会主动被销毁,若不处于任务状态一直运行,在一定程度上会造成资源的浪费,应及时关闭空闲的Worker。销毁方式调用方法有几个,涉及到不同api版本,接下来就根据harmonyos4.0的api归纳一下:

 terminate 主线程销毁woker,close worker内部销毁,onexit会在worker被销毁时调用。api9以上使用,代码示例:

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
workerInstance.onexit = function(code) {
    console.log("onexit");
}

// onexit被执行两种方式:
// 主线程:
workerInstance.terminate();
// worker.ts
import worker from '@ohos.worker';
const workerPort = worker.workerPort;
workerPort.onmessage = function(e) {
    workerPort.close()
}
  • 主动销毁Worker可以调用新创建Worker对象的terminate()或workerPort.close()方法。
  • 自API version 9版本开始,若Worker处于已经销毁或正在销毁等非运行状态时,调用其功能接口,会抛出相应的BusinessError。
  • Worker的创建和销毁耗费性能,建议管理已创建的Worker并重复使用。

worker监听事件

worker添加监听事件有两种方法。addEventListener与on,删除监听也是两种对应的removeEventListener与off,还有一种添加监听时间方式,向Worker添加一个事件监听,事件监听只执行一次便自动删除。也有更爽的删除坚挺的方式,removeAllListener!删除多有监听。

代码示例:

on(type: string, listener: WorkerEventListener): 

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
workerInstance.on("alert", (e)=>{
    console.log("alert listener callback");
})

addEventListener(type: string, listener: WorkerEventListener): void

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})

once(type: string, listener: WorkerEventListener): void

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
workerInstance.once("alert", (e)=>{
    console.log("alert listener callback");
})

off(type: string, listener?: WorkerEventListener): void

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
//使用on接口、once接口或addEventListener接口创建“alert”事件,使用off接口删除事件。
workerInstance.off("alert");

 removeEventListener(type: string, callback?: WorkerEventListener): void

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})
workerInstance.removeEventListener("alert");

worker分发事件

worker的监听事件 监听的是谁?那就是分发事件啊,答案很明显!dispatchEvent,分发定义在Worker的事件。

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");

workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); //timeStamp暂未支持。

分发事件(dispatchEvent)可与监听接口(on、once、addEventListener)搭配使用,示例如下:

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");

//用法一:
workerInstance.on("alert_on", (e)=>{
    console.log("alert listener callback");
})
workerInstance.once("alert_once", (e)=>{
    console.log("alert listener callback");
})
workerInstance.addEventListener("alert_add", (e)=>{
    console.log("alert listener callback");
})

//once接口创建的事件执行一次便会删除。
workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});//timeStamp暂未支持。
//on接口创建的事件可以一直被分发,不能主动删除。
workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
//addEventListener接口创建的事件可以一直被分发,不能主动删除。
workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});

//用法二:
//event类型的type支持自定义,同时存在"message"/"messageerror"/"error"特殊类型,如下所示
//当type = "message",onmessage接口定义的方法同时会执行。
//当type = "messageerror",onmessageerror接口定义的方法同时会执行。
//当type = "error",onerror接口定义的方法同时会执行。
//若调用removeEventListener接口或者off接口取消事件时,能且只能取消使用addEventListener/on/once创建的事件。

workerInstance.addEventListener("message", (e)=>{
    console.log("message listener callback");
})
workerInstance.onmessage = function(e) {
    console.log("onmessage : message listener callback");
}
//调用dispatchEvent分发“message”事件,addEventListener和onmessage中定义的方法都会被执行。
workerInstance.dispatchEvent({type:"message", timeStamp:0});

好的 worker写到这就结束了,接下来就是同步问题了

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值