import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class Test03 {
public static void main(String[] args) throws Exception {
long l = System.currentTimeMillis();
// 暂存数据
// 任务 1:调用推荐接口获取数据
CompletableFuture<String> recommendTask =
CompletableFuture.supplyAsync(() -> {
System.out.println("recommendTask开始工作: 获取推荐接口数据...");
sleepSeconds(5);//睡眠五秒
return "[recommendTask 板块数据]";
});
// 任务 2:调用搜索接口获取数据
CompletableFuture<String> searchTask =
CompletableFuture.supplyAsync(() -> {
System.out.println("searchTask开始工作: 调用搜索接口获取数据...");
sleepSeconds(3); 睡眠五秒
return " [searchTask 板块数据] ";
});
// 任务 3:任务 1 和任务 2 完成后执行,聚合结果
CompletableFuture<String> polymerizationTask =
recommendTask.thenCombine(searchTask, (t1Result, t2Result) -> {
System.out.println("polymerizationTask开始工作" + t1Result + " 与 " + t2Result + "实现去重逻辑处理");
return "[recommendTask 和 searchTask 板块数据聚合结果]";
});
// 等待任务 3 执行结果
String result = polymerizationTask.get(6, TimeUnit.SECONDS);
System.out.println("主线程获取polymerizationTask的结果:" + result);
System.out.println("执行任务需要的毫秒值: " + (System.currentTimeMillis() - l) + "毫秒");
}
// 睡眠工具类
static void sleepSeconds(int timeout) {
try {
TimeUnit.SECONDS.sleep(timeout);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
控制台打印结果
可以看到 recommendTask 和 searchTask 异步去执行, 然后polymerizationTask等待recommendTask 和searchTask 执行完之后汇总他们的结果,
recommendTask开始工作: 获取推荐接口数据...
searchTask开始工作: 调用搜索接口获取数据...
polymerizationTask开始工作[recommendTask 板块数据] 与 [searchTask 板块数据] 实现去重逻辑处理
主线程获取polymerizationTask的结果:[recommendTask 和 searchTask 板块数据聚合结果]
执行任务需要的毫秒值: 5058毫秒