1. 程式人生 > >callable介面配合ExecutorService實現多執行緒處理資料,並接收返回值(2018-08-23)

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;
    }