常見併發異步場景使用 CompletableFuture ParallelStream

併發使用場景

併發流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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章