【发布时间】:2022-01-07 09:54:25
【问题描述】:
场景如下:它可能会随机生成一些数据,如果是,则需要递归检索数据,最后我需要获取所有生成的数据。
interface DataProvider {
List<String> randomData(String url);
}
public static void main(String[] args) {
List<String> strings = fetch(Executors.newFixedThreadPool(4), new DataProvider() {
final Random random = new Random();
@Override
public List<String> randomData(String url) {
if (random.nextBoolean()) {
System.out.println("provide some data");
return List.of(UUID.randomUUID().toString());
}
return null;
}
}, List.of("a", "b", "c"));
System.out.println("results are: ");
System.out.println(strings);
}
private static List<String> fetch(ExecutorService es, DataProvider dataProvider, List<String> items) {
if (items == null || items.isEmpty())
return new ArrayList<>();
List<CompletableFuture<List<String>>> collect =
items.stream()
.map(item -> CompletableFuture.supplyAsync(() -> dataProvider.randomData(item), es))
.collect(Collectors.toList());
List<CompletableFuture<List<String>>> list = new ArrayList<>();
collect.forEach(item -> {
CompletableFuture<List<String>> listCompletableFuture = item.thenApplyAsync(strings -> fetch(es, dataProvider, strings), es);
list.add(listCompletableFuture);
});
return list.stream().flatMap(item -> item.join().stream()).collect(Collectors.toList());
}
有时程序会冻结,有时会打印一个空集合。 (provide some data 已打印)。
我哪里做错了?我对CompletableFuture 一点也不熟悉,所以可能整个递归调用都是错误的。 (或者代码可以更简单,因为CompletableFuture有很多方法)。
【问题讨论】:
标签: java multithreading recursion completable-future