新大陆--多线程--进阶3

下面是测试类
package com.dahuatech.salescloud.performance.service.impl;

import com.alibaba.excel.EasyExcel;
import com.dahuatech.salescloud.core.model.auth.UserDetailDTO;
import com.dahuatech.salescloud.core.utils.ExcelListenerUtil;
import com.dahuatech.salescloud.performance.model.excel.TaskReportExcel;
import org.apache.http.entity.ContentType;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


/**
 * @author ben.Zhou
 * @version 1.0
 * @data 2021/3/10 10:16
 */
public class PoolThread {
    /**
     * 程序的入口
     */
    public static void main(String args[]) throws Exception {
        // readExcel();
        File file = new File("C:\\Users\\wb_xg20\\Desktop\\11.xlsx"); //要读取的excel文件
        MultipartFile mulFile = new MockMultipartFile(
                "haha.jpg", //文件名
                "haha.jpg", //originalName 相当于上传文件在客户机上的文件名
                ContentType.APPLICATION_OCTET_STREAM.toString(), //文件类型
                new FileInputStream(file) //文件流
        );
        //
        readExcel(mulFile);
    }

    /***
     * 1.读取excel
     * 2.对excel进行1000分段
     * 3.开启线程池
     *@paramargs
     * */
    public static void readExcel(MultipartFile multipartFile) {//1.读取excel
        InputStream inputStream = null;
        try {
            inputStream = multipartFile.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        ExcelListenerUtil listenerUtil = new ExcelListenerUtil();
        //读取Excel
        EasyExcel.read(inputStream, TaskReportExcel.class, listenerUtil).sheet().doRead();
        List<TaskReportExcel> read = listenerUtil.getList();
        // ExcelReader excelReader = ExcelUtil.getReader(FileUtil.file("C:\\Users\\admin\\Desktop\\新建文件夹\\XHS 笔记需求 0709-03.xlsx"));
        //List read =excelReader.readAll();
        PoolThread pl = new PoolThread();
        List excelByRead = pl.getExcelByRead(read);//2000条数据,每1000一条,共3组//要开启的线程数//3组
        int size = excelByRead.size();
        ExecutorService pool = Executors.newFixedThreadPool(size + 1);
        long startTime = System.currentTimeMillis();
        System.out.println("start handle time:" + startTime);
        List task_list = new ArrayList();
        for (int i = 0; i < size; i++) {
            List list = (List) excelByRead.get(i);
            DealExcel dx = new DealExcel(i + "-", list);
            task_list.add(dx);
            pool.execute(dx);

        }
        //结束线程池
        pool.shutdown();
        while (true) {
            if (pool.isTerminated()) {
                break;
            }
            try {
                Thread.sleep(100);

            } catch (InterruptedException e) {
                e.printStackTrace();

            }

        }
        // 结束时间
        long endTime = System.currentTimeMillis();
        System.out.println("end handle time:" + endTime);
        // 总耗时
        System.out.println("total handle time:" + (endTime - startTime) + "ms");
        /*String s= "";
        for(Object d : task_list) {
            s= s+d.getThread_name()+":"+(d.getSuccess()?"成功":"失败")+";";

        }*/
        System.out.println("----------------------------------------------");
        //System.out.println(s);
    }

    /***
     * 以200为临界点 每200个放入一个String数组中,再放入List 集合中
     *@paramread
     *@return
     */
    private List getExcelByRead(List read) {
        List list_list = new ArrayList<>();
        int size = read.size();
        int group = 1000;
        int num = size / group;
        if (size % group != 0) {//说明不是整数101-》1+1=2
            num = num + 1;
        }
        System.out.println("准备创建几个数组就是开启多少线程:" + num);//开始遍历excel
        int temp = 0;
        for (int j = 1; j <= num; j++) {
            List list = new ArrayList<>();
            for (int i = temp; i < size; i++) {
                TaskReportExcel map = (TaskReportExcel) read.get(i);

                String keyword = map.getEmployeeNo() + "";

                list.add(keyword);
                if ((i + 1) % group == 0) {
                    temp = i + 1;
                    break;

                }

            }
            System.out.println("*****已经加入集合" + j + "次");
            list_list.add(list);
        }
        System.out.println("########################添加结束##################################");
        return list_list;
    }

}

 

第三总结与思考
多线程还是不错的吧,本人在开发中读取excel是用的easyExcel技术的,本来想进行优化,但是,在导出数据时,有很多限制,而且有主表和附表进行插入,所以只能在这里进行抒发代码情感。
注意:不要一味的去追求使用多线程,要注意使用场景。否则会得不偿失,引火上身奥~
上面的例子只是作者用来记录学习的
希望有错可以给我及时指出来。谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值