我们在执行java多线程并发程序时有时候会碰到执行特别慢的场景,小伙伴们知道是什么原因导致的吗?它要怎么解决呢?下面小编就为你讲讲。
前提:在某地需要开发一个应用系统,此系统主要功能是能够让一些中小型企业填写企业资质信息,然后通过给定的公式,统计这一系列的信息,再以得分的形式展示给上头。当前总共有着1300家企业填报。因为得分是需要实时显示的,因此统计功能会慢到一定程度。
具体代码流程:
a.首先查出1300企业信息
b.循环遍历1300家企业的所有信息,并计算每家企业的具体得分。每家预计时间为0.3秒。合计390秒。所以页面请求超时
c.导出(jxl或jar)
给出解决方案:
因为是处理业务的,所以我们需要能有返回值的线程。因此会使用:Callable
实现
1、调用线程代码List > list = (List > ) map.get("rows");
int taskSize = 20;
// 创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(taskSize);
// 创建多个有返回值的任务
List listFuture = new ArrayList ();
for (int i = 0; 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 > listResult = new ArrayList > ();
for (Future f: listFuture)
{
List > listModel = new ArrayList > ();
try
{
listModel = (List > ) 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
{
//-----------------以下为线程调用的方法------------