首页 > 解决方案 > 如何异步运行两个方法,获取结果,在第三种方法中使用并从第三种方法返回结果

问题描述

我想实现这样的目标:异步运行两个方法,它们返回具有相同对象的列表。一旦两者都被执行,我就可以在代码中传递这两个结果,从而产生第三个函数。我读了很多关于 CompletableFuture 的文章,但有些东西不起作用。我想要实现的一个例子:

 B getResults() {
    List<A> a = new ArrayList<A>();
    List<A> b = new ArrayList<A>();
    List<A> results = new ArrayList<A>();

    // 1/ Call two methods asynchronously to get results for the first and for the second 
   a = getFirstResults();
   b = getSecondResulst();
   //        2 / Use results a and b to populate results
   results.addAll(a);
   results.addAll(b);        
   B finalResults = new B <>();        
   //       3 / Populate finalResults
   finalResults.setResults(results);

   return finalResult;
}

标签: javaspring-boot

解决方案


不是以前那样,CompletableFuture而是在测试中我如何处理一个非常相似的场景:

@Test
void completable() throws Exception {
    CompletableFuture<List<Integer>> taskA = CompletableFuture.supplyAsync(() -> {
        try {
            return resultsFromA();
        } catch (InterruptedException e) {
            e.printStackTrace();
            return new ArrayList<>();
        }
    });
    CompletableFuture<List<Integer>> taskB = CompletableFuture.supplyAsync(() -> {
        try {
            return resultsFromB();
        } catch (InterruptedException e) {
            e.printStackTrace();
            return new ArrayList<>();
        }
    });
    List<Integer> result = new ArrayList<>();
    result = Stream.of(taskA, taskB).map(CompletableFuture::join).flatMap(List::stream).collect(Collectors.toList());
    assertThat(result, is(Arrays.asList(1, 2, 3, 4, 5, 10, 20, 30, 40, 50)));
}

private static List<Integer> resultsFromA() throws InterruptedException {
    Thread.sleep(4000);
    return Arrays.asList(1, 2, 3, 4, 5);
}

private static List<Integer> resultsFromB() throws InterruptedException {
    Thread.sleep(2000);
    return Arrays.asList(10, 20, 30, 40, 50);
}

resultsFromAandresultsFromB应该匹配你的getFirstResultsand getSecondResulst。我将它们包装在 a 中CompletableFuture并将它们组合为流。匹配器和断言来自Hamcrest.


推荐阅读