callable接口配合ExecutorService实现多线程处理数据,并接收返回值(2018-08-23)

/**
 * @author chenzhen
 * Created by chenzhen on 2018/8/22.
 */
@Data
public class QuickPullGit implements Callable<ArrayList<RelationshipBean>> {
    private static Logger logger = LoggerFactory.getLogger(QuickPullGit.class);
    private int threadId;
    private ArrayList<String> serviceNameArrayList = Lists.newArrayList();
    private ArrayList<RelationshipBean> relationshipBeanArrayList = Lists.newArrayList();

    private AnalyzeRelationshipService analyzeRelationshipService = new AnalyzeRelationshipServiceImpl();
    @Override
    public ArrayList<RelationshipBean> call() throws Exception {
        logger.info(Integer.toString(threadId)+"号线程进行远程pull操作");

        for(String serviceName : serviceNameArrayList){
            try{
                RelationshipBean relationshipBean =analyzeRelationshipService.allRelationshipSingleService(serviceName);
                this.relationshipBeanArrayList.add(relationshipBean);
                logger.info(relationshipBean.toString());
            }catch (Exception e){
                e.printStackTrace();
                logger.error(Integer.toString(threadId)+"号线程远程拉取服务"+serviceName+"失败");
            }
        }

        return relationshipBeanArrayList;
    }
}
/**
     * 借助多线程快速获取ArrayList<RelationshipBean>
     * @param serviceNameArrayList 服务名集合
     * @return relationshipBeanArrayList
     */
    public static ArrayList<RelationshipBean> qickGetRelationshipBeanArrayList(ArrayList<String> serviceNameArrayList) {

        ArrayList<RelationshipBean> relationshipBeanArrayList = Lists.newArrayList();
        //将serviceNameArrayList进行拆分
        Map<Integer,List<String>> map1 = ThreadUtil.splitServiceNameArrayList(serviceNameArrayList);

        //根据map1的大小来确定核心线程池的大小
        //设置核心池大小
        int corePoolSize = map1.size();

        ExecutorService threadPoolExecutor = Executors.newFixedThreadPool(corePoolSize);

        //存储每个线程的任务
        Map<Integer,Future<ArrayList<RelationshipBean>>> map2 = Maps.newHashMap();

        //给每个线程分配任务
        for(int i =0;i<corePoolSize;i++){
            QuickPullGit quickPullGit = new QuickPullGit();

            List<String> serviceNameSubList = map1.get(i);
            ArrayList<String> serviceNameSubArrayList = Lists.newArrayList();
            serviceNameSubArrayList.addAll(serviceNameSubList);

            quickPullGit.setServiceNameArrayList(serviceNameSubArrayList);
            quickPullGit.setThreadId(i);

            Future<ArrayList<RelationshipBean>> arrayListFuture = threadPoolExecutor.submit(quickPullGit);

            map2.put(i,arrayListFuture);

        }
        threadPoolExecutor.shutdown();

        //拼接线程的返回值
        for(int i =0;i<corePoolSize;i++){
            try {
                relationshipBeanArrayList.addAll(map2.get(i).get());
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        }

        return relationshipBeanArrayList;
    }

猜你喜欢

转载自blog.csdn.net/qq_33121481/article/details/81986485