併發使用場景
併發流parallelStream:適合計算密集型(運算 排序 合併 過濾 去重)
completableFuture:使用IO密集型(網絡IO 磁盤IO 數據庫IO)
CompletableFuture栗子
同時執行兩個不相關任務,然後合併
private List<UserTask> getNotCompleteUserTask(Long userId) {
//查出完成的
CompletableFuture<List<UserTask>> listComplete = CompletableFuture
.supplyAsync(() -> taskLogRepository.getUserTasksByTaskLog(userId, TaskLog.STATUS.COMPLETE, todayStr()));
//查出未完成的
CompletableFuture<List<UserTask>> listNotComplete = CompletableFuture
.supplyAsync(() -> taskLogRepository.getUserTasksByTaskLog(userId, TaskLog.STATUS.COMPLETE))
.thenApply(userTasks -> setUserTaskParams(userId, userTasks));
//合併
List<UserTask> listAll = listComplete.thenCombine(listNotComplete, (cc, cn) -> { cn.stream().forEach(cc::add);return cc; }).join();
return listAll;
}