java 多线程 变慢_java多线程并发程序执行慢有什么原因?该怎么解决?

我们在执行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 

{

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值