线程函数
说明
提示
- iOS的js引擎天生是单线程模式,无法实现多线程。这里的thread底层实现是多jsvm虚拟机模式
- 多jsvm代表这启动多个不同的js虚拟机,在iOS进程中运行,相互之间进程数据是隔离的。
- 这里的线程是worker模块的简化版,可以直接执行代码片段的,比worker模块简单好用
- 该模块从EC 脱机版本5.0.0+开始适配
thread.execCodeAsync 异步执行代码块
- 异步执行代码块
- 这个是封装好的,直接使用即可
- @param name 线程名称
- @param func 代码块
- @param callbackName 回调的函数名称
- @param callbackFunc 回调 函数
- @return {string}返回的线程名称
function main() {
  // 子线程无法访问外部的变量,
  // 最好的方式 是 在一个js文件中写好业务逻辑,在线程中 直接调用,所有操作都在写得好的js文件中完成
  thread.execCodeAsync("thread1", function () {
    while (!isScriptExit()) {
      sleep(1000)
      logd("sub thread " + new Date())
      var url = "http://baidu.com";
      var pa = {"b": "22"};
      var x = http.httpGet(url, pa, 10 * 1000, {"User-Agent": "test"});
      logd(" result-    " + x);
      // 调用f1函数
      let backdata = thread.invokeCallback("f1", "百度的数据:" + x)
      logd("backdata " + backdata)
    }
  }, "f1", function (name, data) {
    logd("callback " + data)
    return "ok->"
  })
  let timex = 0
  while (!isScriptExit()) {
    logd("main " + new Date())
    sleep(1000)
    timex = timex + 1000
    if (timex > 8000) {
      break
    }
  }
  // 5秒后结束线程
  thread.cancelThread("thread1")
  thread.stopAll();
  sleep(1000)
  logd("thread1 cancel " + thread.isCancelled("thread1"))
  // 或者使用cancelThread
  // thread.cancelThread("thread1")
}
main();
thread.invokeCallback 调用回调函数
- 调用 addCallback 设置的函数 ,通过funcName先找到,然后进行调用
- @param funcName 回调函数名称
- @param data 回调数据
- @return {*}函数返回的数据
function main() {
    // 请看 thread.execCodeAsync 函数例子
}
main();
thread.newThread 新的线程
- 创建一个新的线程封装类
- @param name 线程名称,不填写会自动生成随机数
- @return {ThreadClient|null}
function main() {
  let name = "thread2";
  let th = thread.newThread(name)
  // 增加回调,可以不写
  th.addCallback("f1", function (name, data) {
    logd("callback " + data)
    return "ok"
  });
  //异步执行
  th.execAsync(function () {
    var url = "http://baidu.com";
    var pa = { "b": "22" };
    var x = http.httpGet(url, pa, 10 * 1000, { "User-Agent": "test" });
    
    let backdata = thread.invokeCallback("f1",x)
    logd("backdata "+backdata)
    
  });
  sleep(5000);
  logd("结束 ");
}
main();
addCallback 增加回调函数
- 在线程对象上, 增加回调函数
- @param name 函数名
- @param func 回调函数
function main() {
  // 请看 thread.newThread 函数例子
}
main();
thread.cancelThread 取消线程
- 取消线程的执行
- @param t 线程对象ID
- @return boolean
function main() {
  // 请看 thread.execCodeAsync 函数例子
}
main();
thread.stopAll 停止所有线程
- 取消所有正在运行的线程
function main() {
    // 请看 thread.execCodeAsync 函数例子
}
main();
thread.isCancelled 取消判断
- 取消线程的执行
- @param t 线程对象ID
- @return boolean true代表已经取消了,false表示未取消
function main() {
  // 请看 thread.execCodeAsync 函数例子
}
main();
thread.putShareKeyValue 存储共享数据
- 存储共享数据
- 这个是kv结构的共享区
- @param key 数据的key 字符串
- @param value 数据的值,字符串
// js/sub_thread_func.js 文件内容 
function subThreadFunc(){
  logd("subThreadFunc 执行。。。")
  thread.putShareKeyValue("key","vb1")
  thread.putShareValue("我是subThreadFunc")
}
// js/main.js 文件内容 
function threadTest() {
  // 子线程无法访问外部的变量,
  // 最好的方式 是 在一个js文件中写好业务逻辑,在线程中 直接调用,所有操作都在写得好的js文件中完成
  let name = "thread2";
  let th = thread.newThread(name)
  //异步执行
  th.execAsync(function () {
    var testData = readIECFileAsString("js/sub_thread_func.js");
    // subThreadFunc 是sub_thread_func文件中定义的 ,加上执行函数
    testData = (testData+" ;subThreadFunc();")
    // 开始执行
    let dx = execScript(2, testData);
  });
  while (!isScriptExit()) {
    sleep(100)
    // 从 kv 共享区取值
    let kvValue = thread.getShareKeyValue("key")
    if (kvValue != "") {
      logd("获取: key " + kvValue)
    }
    // 从数组共享区取值
    let arValue = thread.getShareValue()
    if (arValue != "") {
      logd("获取到之后 执行动作 模拟主线程执行任务。。。 arValue = " + arValue)
      sleep(1000)
      logd("任务结束,重新获取指令")
    }
  }
}
threadTest();
thread.getShareKeyValue 从共享区获取数据
- 从共享区获取数据
- 该函数获取后,会自动移出key对应的值
- 适配EC 脱机版本5.20.0+
- @param key 和putShareKeyValue对应的key
- @return {string}字符串
    // 看 thread.putShareKeyValue 函数  例子
thread.putShareValue 存储数据到共享区
- 存储数据到共享区
- 这个底层是数组形式实现
- 适配EC 脱机版本5.20.0+
- @param value 存储的值
    // 看 thread.putShareKeyValue 函数例子
thread.getShareValue 共享区取值
- 共享区取值
- 底层是数组,先进先出的原理,取索引为0的数据并且移出
- 适配EC 脱机版本5.20.0+
- @return {string}字符串
    // 看 thread.putShareKeyValue 函数例子