callable介面配合ExecutorService實現多執行緒處理資料,並接收返回值(2018-08-23)
阿新 • • 發佈:2019-01-01
/**
* @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;
}