public void executeRecommend(JSONArray arrayList, List<User> recommendList) {
//默认开启五个线程
int asynCount = recommendList.size() < 5 ? recommendList.size() : 5;
List<List<String>> list = new ArrayList<>(asynCount);
for (int i = 0; i < recommendList.size(); i++) {
if (list.size() < asynCount) {
List<String> temp = new ArrayList<>();
temp.add(recommendList.get(i).getName());
list.add(temp);
} else {
list.get(i % asynCount).add(recommendList.get(i).getName());
}
}
CompletableFuture[] completableFutures = list.stream().map(e -> {
return aysnCallRC339(e);
}).toArray(CompletableFuture[]::new);
CompletableFuture.allOf(completableFutures).join();//阻塞所有
for (CompletableFuture temp : completableFutures) {
try {
JSONArray jsonArray = (JSONArray) temp.get();
arrayList.addAll(jsonArray);
} catch (Exception e) {
System.out.println("同步数据失败");
}
}
}
private CompletableFuture<JSONArray> aysnCallRC339(List<String> entList) {
return CompletableFuture.supplyAsync(() -> {
JSONArray objectsa = new JSONArray();
for (String recommendEnt : entList) {
System.out.println("开始调异步");
//假装这里调用接口
JSONObject compositeScore = null;
if (compositeScore == null) {
continue;
} else {
JSONObject jsonObject = new JSONObject();
jsonObject.put("a", "a");
jsonObject.put("b", "b");
jsonObject.put("c", "c");
objectsa.add(jsonObject);
}
}
System.out.println("调用成功");
return objectsa;
});
}
}
线程之绝唱
该博客介绍了如何使用CompletableFuture进行异步处理,通过将推荐列表分块并行调用aysnCallRC339方法,以提高推荐系统的效率。在处理过程中,如果推荐列表长度小于5,则按列表大小开启线程,否则默认开启5个线程。每个线程处理一部分用户数据,并将结果合并到最终的JSONArray中。在遇到异常时,系统会记录‘同步数据失败’的信息。
摘要由CSDN通过智能技术生成