如何优化多线程慢的问题

有20万的数据量,在插入数据库的时候使用多线程跑,还是慢,大概要花30分钟左右,而且越跑越慢,请问一下,如何优化,代码如下:

1、创建多线程

 //创建多线程
    public void exec(List<VSmCompany> list) throws InterruptedException {
        int count = 500;
        int listSize = list.size();
        int runSize = (listSize / count) + 1;   //开启的线程数
//        List<VSmCompany> newList = null;     //存放每个线程的执行数据
        ExecutorService executor = Executors.newFixedThreadPool(runSize);   //创建一个线程池,数量和开启线程的数量一样
        CountDownLatch begin = new CountDownLatch(1);    //计数器
        CountDownLatch end = new CountDownLatch(runSize);

        //循环创建线程
        for (int i = 0; i < runSize; i++) {
            //计算每个线程执行的数据
            if ((i + 1) == runSize) {
                int startIndex = (i * count);
                int endIndex = list.size();
                List<VSmCompany> newList = list.subList(startIndex,endIndex);
                executor.execute(new MyThread(newList,begin,end));
            } else {
                int startIndex = (i * count);
                int endIndex = (i + 1) * count;
                List<VSmCompany> newList = list.subList(startIndex,endIndex);
                executor.execute(new MyThread(newList,begin,end));
            }

        }
        begin.countDown();
        end.await();
        //执行完关闭线程池
        executor.shutdown();

    }

 2、业务逻辑

public class MyThread implements Runnable {

    private static Logger logger = LoggerFactory.getLogger(MyThread.class);
    private SmComJudgeTaskService smComJudgeTaskService;

    private List<VSmCompany> list;
    private CountDownLatch begin;
    private CountDownLatch end;

    public MyThread(List<VSmCompany> list, CountDownLatch begin, CountDownLatch end) {
        this.list = list;
        this.begin = begin;
        this.end = end;
    }

    @Override
    public void run() {
        smComJudgeTaskService = SpringContextHolder.getApplicationContext().getBean(SmComJudgeTaskService.class);
        try {
            for (int i = 0; i < list.size(); i++) {
                SmComJudgeTask judgeTask = new SmComJudgeTask();
                judgeTask.setComId(list.get(i).getId());
                judgeTask.setComName(list.get(i).getQymc());
                judgeTask.setGpsAddress(list.get(i).getGpsAddr());
                judgeTask.setGpsLatitude(list.get(i).getGpsLatitude());
                judgeTask.setGpsLongitude(list.get(i).getGpsLongitude());
                judgeTask.setProvinceCode(list.get(i).getProvience());
                judgeTask.setCountyCode(list.get(i).getCounty());
                judgeTask.setCityCode(list.get(i).getCity());
                judgeTask.setCompanyType(list.get(i).getCompanyType());
                judgeTask.setSocialCode(list.get(i).getXydm());
                judgeTask.setLegalPerson(list.get(i).getFzr());
                judgeTask.setLegalPersonPhone(list.get(i).getLxdh());
                judgeTask.setAddress(list.get(i).getZs());
                judgeTask.setTaskSource("1");
                judgeTask.setTaskStatus("0");
                judgeTask.setTaskIssueTime(new Date());
                judgeTask.setSuperviseCategory("1");
                judgeTask.setCompanyCategory("1");
                judgeTask.setJudgeType("10");
                smComJudgeTaskService.save(judgeTask);
            }
}

 

那你多线程肯定没用对。不然不可能效率没变化。

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632