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 serviceNameArrayList = Lists.newArrayList();
    private ArrayList relationshipBeanArrayList = Lists.newArrayList();

    private AnalyzeRelationshipService analyzeRelationshipService = new AnalyzeRelationshipServiceImpl();
    @Override
    public ArrayList 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
     * @param serviceNameArrayList 服务名集合
     * @return relationshipBeanArrayList
     */
    public static ArrayList qickGetRelationshipBeanArrayList(ArrayList serviceNameArrayList) {

        ArrayList relationshipBeanArrayList = Lists.newArrayList();
        //将serviceNameArrayList进行拆分
        Map> map1 = ThreadUtil.splitServiceNameArrayList(serviceNameArrayList);

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

        ExecutorService threadPoolExecutor = Executors.newFixedThreadPool(corePoolSize);

        //存储每个线程的任务
        Map>> map2 = Maps.newHashMap();

        //给每个线程分配任务
        for(int i =0;inew QuickPullGit();

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

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

            Future> arrayListFuture = threadPoolExecutor.submit(quickPullGit);

            map2.put(i,arrayListFuture);

        }
        threadPoolExecutor.shutdown();

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

        return relationshipBeanArrayList;
    }

你可能感兴趣的:(零碎笔记)