膜拜java的gravatar头像
膜拜java2017-12-04 21:37:53
java多线程执行处理业务时间久的代码

背景:在政府开发了一个应用系统,主要功能是让企业填写企业资质信息,然后通过给定的公式,统计这一系列的信息,以得分的形式展示给政府领导查看。目前有1300家企业填报。由于得分是实时显示的,所以导致统计功能很慢。

代码运行流程:1、查出1300企业信息
2、遍历1300企业信息,ji计算每家企业得分信息。每家预计时间为0.3秒。合计390秒。导致页面请求超时

3、导出(用jxl jar)

解决方案:

由于处理业务的,所以需要能有返回值的线程。用:Callable

直接上代码

1、调用线程的代码

List<Map<String,Object>> list = (List<Map<String, Object>>) map.get("rows");

int taskSize = 20;

// 创建一个线程池

ExecutorService pool = Executors.newFixedThreadPool(taskSize);

// 创建多个有返回值的任务  

List<Future> listFuture = new ArrayList<Future>();  

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<Map<String, Object>> listResult = new ArrayList<Map<String, Object>>();  

for (Future f : listFuture) {

List<Map<String, Object>> listModel = new ArrayList<Map<String, Object>>();

try {

listModel = (List<Map<String, Object>>) f.get();

} 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<Object> {

//-----------------以下为线程调用的方法----------------

private List<Map<String,Object>> list;

private HttpSession session;

private String staticFlag;

private DeclareService declareService;

private DeclareMasterService declareMasterService;

private EnterpriseQueryService enterpriseQueryService;

public MyCallable(List<Map<String,Object>> list,HttpSession session,String staticFlag,

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,Object> maplist = list.get(i);

String mainId= maplist.get("ID")+"";

this.gradeMaster(session, mainId, maplist.get("orgId")+"",declareMasterService,enterpriseQueryService);

List<Map<String,Object>> listscore = declareMasterService.queryScoreMain(maplist.get("ID")+"",info.getRightType(), "report");

// 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(SHSTATUS)){

maplist.put("STRSHSTATUS", "修改为评价");

}

if("1".equals(staticFlag)){

//添加修改意见

List<Map<String, Object>> listDetail = declareService.queryAuditLog(mainId);

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", "");

}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<Map<String,Object>> listDetail = declareMasterService.queryTaskDetail(mainId);

if("2".equals(rightType)||"3".equals(rightType)){

//将String 转为 float

for (int i = 0; i < listDetail.size(); i++) {

Map<String,Object> map = listDetail.get(i);

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<String,Object> map = listDetail.get(i);

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<String,Object> enterprise= enterpriseQueryService.getInfoByOrgId(orgId).get(0);

//根据 安徽省企业技术中心评价指标计算公式 进行算值 下一步算分

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<String,Object> map = DeclareController.getValue(resultFirst,ratio1,ratio2,ratio3);

Float[] resultValue = (Float[]) map.get("resultValue");

Float[] resultScoreValue = (Float[]) map.get("resultScoreValue");

Float[] resultScore = DeclareController.getScore(resultScoreValue);

Float scoreTotal = 0f;

List<Map<String,Object>> listScore = declareMasterService.queryScoreDic();

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秒。

以此博客记录我自己钻研多线程的结果。撒花。 


打赏

已有2人打赏

2B逍遥荡的gravatar头像最代码官方的gravatar头像

分享到:

最近浏览
csy0806 LV15月30日
星星
xp9522 LV55月3日
月亮星星
123456po LV35月3日
星星星星星星
梦醒繁华丶 LV184月26日
太阳星星星星
Evil_dong LV43月7日
月亮
S_Bility LV183月5日
太阳星星星星
孙启政 LV73月1日
月亮星星星星星星
papayaqq LV43月1日
月亮
wgc_jy LV202月2日
太阳月亮
zhos0212 LV151月26日
月亮月亮月亮星星星星星星
顶部客服微信二维码底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友