package com.lyr.demo.controller;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.RandomUtil;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.*;
/**
* @author kaka
* @date 2022/4/10 23:04
**/
@Slf4j
public class CompletableFutureTestController {
private static final ExecutorService executor = new ThreadPoolExecutor(1, 128,
60L, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(1),
new ThreadPoolExecutor.CallerRunsPolicy());
public static void main(String[] args) {
List<Integer> testDataList = ListUtil.toList(1, 2, 3, 4, 5);
CompletableFuture[] completableFutures = testDataList
.stream()
.map(testData -> CompletableFuture.supplyAsync(
() -> {
int i = RandomUtil.randomInt(3, 10);
log.info("线程池开始执行:{}",i);
ThreadUtil.sleep(i, TimeUnit.SECONDS);
ArrayList<String> strings = ListUtil.toList("我是:" + testData);
log.info("线程池执行结束:{}",i);
return strings;
}, executor)
).toArray(CompletableFuture[]::new);
log.info("执行到这里了:{}", completableFutures);
CompletableFuture.allOf(completableFutures).join();
log.info("执行完毕:{}", completableFutures);
List<String> lastStrings = Collections.synchronizedList(new ArrayList<>());
for (CompletableFuture completableFuture : completableFutures) {
completableFuture.whenComplete((testDatas, e) -> {
log.info("获取到的testDatas:{}", testDatas);
if (null != e) {
log.error("执行发生异常,异常信息:{}", e);
return;
}
if (testDatas instanceof List) {
lastStrings.addAll((List<String>) testDatas);
}
});
}
log.info("返回的数据:{}", lastStrings);
executor.shutdown();
}
}
参考:线程池ForkJoinPool简介
FORKJOINPOOL 分支合并框架
CompletableFuture 详解(一):基本概念及用法