magic-api实现多线程,确保线程安全的变量
前言
最近项目中使用到magic-api做接口的快速开发,由于业务需要使用多线程提供查询效率,特此记录,便于以后查找
一、magic-api是什么?
官网介绍:
magic-api是一个基于Java的接口快速开发框架,编写接口将通过magic-api提供的UI界面完成,自动映射为HTTP接口。 无需定义Controller、Service、Dao、Mapper、XML、VO等Java对象即可完成常见的HTTP API接口开发
官网地址:
https://www.ssssssss.org/magic-api/
2.如何实现多线程
magic-api采用异步调用的方式实现多线程,使用关键字async 官方示例如下
官网地址:https://www.ssssssss.org/magic-api/pages/base/async/
在实际使用中存在变量安全性问题,由于使用async关键字会另起一个线程执行,当每个线程需要传入不同变量时,直接使用for循环会存在同一个变量重复执行问题,针对这一问题采用函数(理解为一个java方法,如何定义函数详见官方示例 https://magic-api.ssssssss.org.cn/magic/web/index.html)解决
示例代码:
import '@/from/tableDataList' as getTableDataList; //引入函数
var sql= """
SELECT table_name AS tableName FROM table
"""
//查询所有的表
var tableList = db.select(sql);
//结果列表
var resultList = [];
for(table in tableList){
//异步执行 多线程
table.put("xxx",'xxx'); //table对象中可以添加自定义参数
resultList.add(async (table)=>getTableDataList(table));
}
resultList = resultList.map(item=>item.get()); // 循环获取结果
//倒序排列
var resultSort = resultList.sort((a,b)=>a.value - b.value);
return resultSort ;
采用调用一个函数,将变量作为形参传入的方法可以确保线程安全的变量