多线程Future处理list数据

/**
     * 多线程处理list数据
     */
    public Map<String, Object> execuleThread() {
        Map<String, Object> ret = new LinkedHashMap<>();
        try {
            Long t1 = System.currentTimeMillis();
            List<BehospitalInfo> behospitalInfoList = new ArrayList<>(); // 需要处理的列表数据
            int threadNum = 4; // 推荐的总线程数 = cpu个数 * 每个cpu的核数
            List<List<BehospitalInfo>> threadData = divideByCopies(behospitalInfoList, threadNum);
            List<Future<String>> list = new ArrayList<>();

            ExecutorService executor = Executors.newFixedThreadPool(threadNum);
            for (int i = 0; i < threadNum; i++) {
                final int index = i; // 这一行代码很重要,如果使用成员变量,下面会报错
                Future<String> future = executor.submit(new Callable<String>() {
                    @Override
                    public String call() {
                        StringBuffer sb = new StringBuffer();
                        int sucNum = 0, errNum = 0;
                        List<BehospitalInfo> data = threadData.get(index);
                        System.out.println("******************************线程" + index + "正在执行");
                        if (ListUtil.isNotEmpty(data)) {
                            for (BehospitalInfo bean : data) {
                                // 处理业务数据
                                if (处理成功) {
                                    sucNum++;
                                } else {
                                    errNum++;
                                }
                            }
                            sb.append("线程" + index + "执行完毕:共【" + data.size() + "】条,成功【" + sucNum + "】条,失败【" + errNum + "】条。");
                        } else {
                            sb.append("线程" + index + "未执行数据");
                        }
                        return sb.toString();
                    }
                });
                list.add(future);
            }

            // 拼接返回数据
            for (int i = 0; i < list.size(); i++) {
                Future<String> future = list.get(i);
                while(!future.isDone()); // 这一行代码很重要
                ret.put("线程" + i , future.get());
            }
            Long t2 = System.currentTimeMillis();
            ret.put("总条数", behospitalInfoList.size());
            ret.put("共执行时间:", (t2 - t1) / 1000 + "秒");
        } catch (Exception e) {
            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR);
        }
        return  ret;
    }

    /**
     * 将列表按列表总长度划分
     *
     * @param originList 数据
     * @param num 份数
     * @param <T>
     * @return
     */
    public <T> List<List<T>> divideByCopies(List<T> originList, int num) {
        List<List<T>> list = new ArrayList<>();
        if (ListUtil.isEmpty(originList) || num < 0) {
            return null;
        }
        for (int i = 0; i < num; i++) {
            list.add(new ArrayList<T>());
        }
        for (int i = 0; i < originList.size(); i++) {
            list.get(i % num).add(originList.get(i));
        }

        return list;
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

屁仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值