一 场景:比如说这儿要获取sku的信息,要根据属性定义id和属性值id获取到对应的信息。其实这两个没有关系,就可以使用并发执行。
1 不使用并发的实现
private String _loadSkuInfoOne(String skuSpecDefIdAndValId){
String defId = StringUtils.substringBefore(skuSpecDefIdAndValId,":");
String valId = StringUtils.substringAfter(skuSpecDefIdAndValId,":");
String spName = itemDao.tbSpecDef.rowOptional(Convert.toLong(defId)).map(x->x.s("spName")).orElse("");
String spvName = itemDao.tbSpecVal.rowOptional(Convert.toLong(valId)).map(x->x.s("spvName")).orElse("");
return spName+":"+spvName;
}
2 使用并发实现的方法一:
private String _loadSkuInfoOne(String skuSpecDefIdAndValId){
String defId = StringUtils.substringBefore(skuSpecDefIdAndValId,":");
String valId = StringUtils.substringAfter(skuSpecDefIdAndValId,":");
List<Supplier<String>> supplierList = List.of(
()->itemDao.tbSpecDef.rowOptional(Convert.toLong(defId)).map(x->x.s("spName")).orElse(""),
()->itemDao.tbSpecVal.rowOptional(Convert.toLong(valId)).map(x->x.s("spvName")).orElse("")
);
return supplierList.parallelStream().map(x->x.get()).collect(Collectors.joining(":"));
}
3 使用并发实现的方法二
private String _loadSkuInfoOne(String skuSpecDefIdAndValId){
String defId = StringUtils.substringBefore(skuSpecDefIdAndValId,":");
String valId = StringUtils.substringAfter(skuSpecDefIdAndValId,":");
AtomicReference<String> spName = new AtomicReference<>();
AtomicReference<String> spvName = new AtomicReference<>();
List<Runnable> runnableList = List.of(
()->spName.set(itemDao.tbSpecDef.rowOptional(Convert.toLong(defId)).map(x -> x.s("spName")).orElse("")),
()->spvName.set(itemDao.tbSpecVal.rowOptional(Convert.toLong(valId)).map(x->x.s("spvName")).orElse(""))
);
runnableList.parallelStream().forEach(x->x.run());
return spName.get()+":"+spvName.get();
}
网友评论