Flask接口签名sign原理与实例代码浅析
455
2023-03-08
Java多线程执行处理业务时间太久解决方法代码示例
背景:在政府开发了一个应用系统,主要功能是让企业填写企业资质信息,然后通过给定的公式,统计这一系列的信息,以得分的形式展示给政府领导查看。目前有1300家企业填报。由于得分是实时显示的,所以导致统计功能很慢。
代码运行流程:
1、查出1300企业信息
2、遍历1300企业信息,ji计算每家企业得分信息。每家预计时间为0.3秒。合计390秒。导致页面请求超时
3、导出(用jxl jar)
解决方案:
由于处理业务的,所以需要能有返回值的线程。用:Callable
直接上代码
1、调用线程的代码
List
int taskSize = 20;
// 创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(taskSize);
// 创建多个有返回值的任务
List
for (int i = 0; i < taskSize; i++) {
System.out.println("我启用多线程啦啦啦");
int evgCount = list.size()/taskSize;
Callable c = new MyCallable(list.subList(evgCount*i, evgCount*(i+1)),session,staticFlag,
declareService,declareMasterService,enterpriseQueryService);
// 执行任务并获取Future对象
Future f = pool.submit(c);
listFuture.add(f);
}
pool.shutdown();
// 获取所有并发任务的运行结果
List
for (Future f : listFuture) {
List
try {
listModel = (List
}
catch (InterruptedException e) {
e.printStackTrace();
}
catch (ExecutionException e) {
e.printStackTrace();
}
listResult.addAll(listModel);
}
map.put("rows", listResult);
2、线程的代码
package usi.jszx.controller;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang3.StringUtils;
import usi.jszx.entity.ScoreMain;
import usi.jszx.service.DeclareMasterService;
import usi.jszx.service.DeclareService;
import usi.jszx.service.EnterpriseQueryService;
import usi.sys.dto.AuthInfo;
import usi.sys.util.ConstantUtil;
class MyCallable implements Callable
//-----------------以下为线程调用的方法----------------
private List
private HttpSession session;
private String staticFlag;
private DeclareService declareService;
private DeclareMasterService declareMasterService;
private EnterpriseQueryService enterpriseQueryService;
public MyCallable(List
DeclareService declareService,DeclareMasterService declareMasterService,EnterpriseQueryService enterpriseQueryService) {
this.list = list;
this.session = session;
this.staticFlag = staticFlag;
this.declareService = declareService;
this.declareMasterService = declareMasterService;
this.enterpriseQueryService = enterpriseQueryService;
}
@Override
public Object call() throws Exception {
AuthInfo info = (AuthInfo)session.getAttribute(ConstantUtil.AUTH_INFO);
for (int i = 0; i < list.size(); i++) {
Map
String mainId= maplist.get("ID")+"";
this.gradeMaster(session, mainId, maplist.get("orgId")+"",declareMasterService,enterpriseQueryService);
List
// declareMasterService.queryScoreMain(mainId,info.getRightType(),isreport);
int isdouble = 1;
if(listscore.size()>30){
maplist.put("SOCRETOTAL", listscore.get(46).get("SCORE"));
isdouble = 2;
} else if(listscore.size()>22){
maplist.put("SOCRETOTAL", listscore.get(23).get("SCORE"));
}
if("3".equals(staticFlag)){
for (int j = 0; j < 23; j++) {
if(j<9){
maplist.put("VALUE0"+(j+1), listscore.get(j*isdouble).get("SHOW_VALUE"));
} else{
maplist.put("VALUE"+(j+1), listscore.get(j*isdouble).get("SHOW_VALUE"));
}
}
}
//地市展示
String COUNTYID = maplist.get("COUNTYID")+"";
if("340826".equals(COUNTYID)||"341822".equals(COUNTYID)){
maplist.put("CITYNAME",maplist.get("COUNTYNAME")+"");
}
//企业类型
String DECLARE_EVALUATE = maplist.get("DECLARE_EVALUATE")+"";
if("1".equals(DECLARE_EVALUATE)){
maplist.put("DECLARE_EVALUATE_NAME","申报");
} else{
maplist.put("DECLARE_EVALUATE_NAME","评价");
}
//审核状态
String SHSTATUS = maplist.get("SHSTATUS")+"";
if("9".equals(SHSTATUS)){
maplist.put("STRSHSTATUS", "草稿");
} else if("0".equals(SHSTATUS)){
maplist.put("STRSHSTATUS", "企业提交");
} else if("1".equals(SHSTATUS)){
maplist.put("STRSHSTATUS", "市审核通过");
} else if("2".equals(SHSTATUS)){
maplist.put("STRSHSTATUS", "市审核不通过");
} else if("3".equals(SHSTATUS)){
maplist.put("STRSHSTATUS", "省审核通过");
} else if("4".equals(SHSTATUS)){
maplist.put("STRSHSTATUS", "省审核不通过");
} else if("5".equals(SHSTATUS)){
maplist.put("STRSHSTATUS", "省级审核中");
} else if("6".equals(SHSTATUS)){
maplist.put("STRSHSTATUS", "退回企业修改");
} else if("7".equals(SHSTATUS)){
maplist.put("STRSHSTATUS", "市级审核中");
} else if("11".equals(SHSTATUS)){
maplist.put("STRSHSTATUS", "修改为申报");
} else if("12".equals(SHhttp://STATUS)){
maplist.put("STRSHSTATUS", "修改为评价");
}
if("1".equals(staticFlag)){
//添加修改意见
List
if(listDetail.size()>0){
String AUDIT_OPINION = listDetail.get(0).get("AUDIT_OPINION")+"";
if(!StringUtils.isEmpty(AUDIT_OPINION)&&!"null".equals(AUDIT_OPINION)){
maplist.put("AUDIT_OPINION", AUDIT_OPINION);
} else{
maplist.put("AUDIT_OPINION", "");
}
}
//是否更名 曾用名
String ORGNAME = maplist.get("ORGNAME")+"";
String PJNAME = maplist.get("PJNAME")+"";
if(StringUtils.isEmpty(PJNAME)||"null".equals(PJNAME)
||PJNAME.equals(ORGNAME)){
maplist.put("ISGENGMING", "否");
maplist.put("PJNAME_E", ""gpAkh);
} else{
maplist.put("ISGENGMING", "是");
maplist.put("PJNAME_E", PJNAME);
}
} else if("2".equals(staticFlag)){
}
}
return list;
}
public float gradeMaster(HttpSession session,String mainId,String orgId,
DeclareMasterService declareMasterService,EnterpriseQueryService enterpriseQueryService) {
AuthInfo info = (AuthInfo)session.getAttribute(ConstantUtil.AUTH_INFO);
String rightType=info.getRightType();
declareMasterService.deleteScoreMain(mainId);
float[] resultFirst = new float[100];
/*
* 先查询所有 附表列表
* 查看得分的地方,是直接查找主表数据的
*
* 既然审核了,主表数据肯定存起来了
* */
List
if("2".equals(rightType)||"3".equals(rightType)){
//将String 转为 float
for (int i = 0; i < listDetail.size(); i++) {
Map
if(StringUtils.isEmpty(map.get("DECLARE_CITY_VALUE")+"")
||"null".equals(map.get("DECLARE_CITY_VALUE")+"")){
resultFirst[i]=0f;
} else{
resultFirst[i] = float.parsefloat(map.get("DECLARE_CITY_VALUE")+"");
}
}
} else{
//将String 转为 float
for (int i = 0; i < listDetail.size(); i++) {
Map
if(StringUtils.isEmpty(map.get("DECLARE_PROVINCE_VALUE")+"")
||"null".equals(map.get("DECLARE_PROVINCE_VALUE")+"")){
resultFirst[i]=0f;
} else{
resultFirst[i] = float.parsefloat(map.get("DECLARE_PROVINCE_VALUE")+"");
}
}
}
Map
//根据 安徽省企业技术中心评价指标计算公式 进行算值 下一步算分
float ratio1 = 0f;
float ratio2 = 0f;
float ratio3 = 0f;
try {
ratio1 = float.parsefloat(enterprise.get("RATIO1")+"");
ratio2 = float.parsefloat(enterprise.get("RATIO2")+"");
ratio3 = float.parsefloat(enterprise.get("RATIO3")+"");
}
catch (Exception e) {
}
Map
float[] resultValue = (float[]) map.get("resultValue");
float[] resultScoreValue = (float[]) map.get("resultScoreValue");
float[] resultScore = DeclareController.getScore(resultScoreValue);
float scoreTotal = 0f;
List
for (int i = 0; i < listScore.size(); i++) {
ScoreMain scoreMain = new ScoreMain();
scoreMain.setMainId(mainId);
scoreMain.setScoreName(listScore.get(i).get("SCORE_NAME")+"");
scoreMain.setScoreUnit(listScore.get(i).get("SCORE_UNIT")+"");
scoreMain.setScoreWeight(listScore.get(i).get("SCORE_WEIGHT")+"");
scoreMain.setDisOrder(listScore.get(i).get("DIS_ORDER")+"");
scoreMain.setShowValue(resultValue[i]+"");
scoreMain.setScoreValue(resultScoreValue[i]+"");
scoreMain.setScore(resultScore[i]+"");
declareMasterService.inserScoreMain(scoreMain);
scoreTotal +=resultScore[i];
}
return scoreTotal;
}
}
说明:MyCallable仅仅是业务处理方式繁杂。可忽略,最后从390秒提速致40秒。
总结
以上就是本文关于Java多线程执行处理业务时间太久解决方法代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~