阅读背景:

Java 多线程任务分解-ForkJoinPool(带返回值)示例

来源:互联网 
 
 
BaiduGetDishs.java类
 
 
package com.hwm.api.baidu.impl.dish;

import com.hwm.api.baidu.BaiduEnvironment;
import com.hwm.api.baidu.entity.dish.BaiduDish;
import com.hwm.api.baidu.entity.dish.BaiduMenu;
import com.hwm.api.baidu.impl.BaiduDishApi;
import com.hwm.exception.WMApiException;
import com.hwm.organization.entity.ApiResult;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.*;
import java.util.concurrent.ForkJoinPool;

public class BaiduGetDishs {

    private final static ForkJoinPool POOL = new ForkJoinPool();

    private BaiduGetDishs() {
    }

    /**
     用过任务分解获取
     @param baiduMenuList
     @param apiEnvironment
     @return
     */
    public static List<BaiduDish> getDishsFast(List<BaiduMenu> baiduMenuList, BaiduEnvironment apiEnvironment) { //第一个参数是任务内容id,第二参数是任务环境
        if (CollectionUtils.isEmpty(baiduMenuList)) {
            return new ArrayList<>();
        }


        List<HashMap> baiduDishIds=new  ArrayList<>();
        for (int i=0;i<baiduMenuList.size();i++){

            for (BaiduDish baiduDish:baiduMenuList.get(i).getProducts()){
                if(StringUtils.isNotBlank(baiduDish.getBaidu_dish_id())){
                    HashMap map=new HashMap();
                    map.put("baidu_dish_id",baiduDish.getBaidu_dish_id());
                    baiduDishIds.add(map);
                }
            }
        }

        Map<Integer, List<HashMap>> orderGroups;
        //最多只能分解6个任务
        //尽量平均分配
        if (baiduDishIds.size() <= 7) {
            orderGroups = dishIdDecompose(baiduDishIds, 1);
        } else if (baiduDishIds.size() <= 28) {
            orderGroups = dishIdDecompose(baiduDishIds, 2);
        } else if (baiduDishIds.size() <= 60) {
            orderGroups = dishIdDecompose(baiduDishIds, 3);
        } else if(baiduDishIds.size() <= 80){
            orderGroups = dishIdDecompose(baiduDishIds, 4);
        } else if(baiduDishIds.size() <= 120){
            orderGroups = dishIdDecompose(baiduDishIds, 5);
        }else{
            orderGroups = dishIdDecompose(baiduDishIds, 6);
        }

        BaiduDishApi baiduDishApi = new BaiduDishApi(apiEnvironment);
        DishRecursiveTask task = new DishRecursiveTask(orderGroups, baiduDishApi);
        POOL.submit(task);

        try {
            return task.get();
        }catch (Exception e) {
            throw new WMApiException(e);
        }

    }


    /**
     菜品分解
     @param baiduDishIds
     @param group 分解析的组数

     @return
     */
    private static Map<Integer,List<HashMap>> dishIdDecompose(List<HashMap> baiduDishIds, int group) {
        Map<Integer, List<HashMap>> groups = new HashMap<>();
        //分组不能小于1 大于 8
        if (group <= 0 || group >= 7) {
            throw new WMApiException("菜品分组不合理");
        }

        float flag = 1.0f * baiduDishIds.size() / group;  //平均下去
        int offset = Math.round(flag);

        Iterator<HashMap> iterator = baiduDishIds.iterator();
        for (int i = 1; i <= group; i++) {
            List<HashMap> item = new ArrayList<>();
            groups.put(i, item);
            for (int j = 1; j <= offset; j++) {
                if (iterator.hasNext()) {
                    item.add(iterator.next());
                } else {
                    break;
                }
            }
        }
        while (iterator.hasNext()) {
            groups.get(group).add(iterator.next());
        }
        return groups;
    }

}
package com.hwm.api



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: