Java 8-如何使用CompletableFuture跟踪在异步并行流中调用的异常数

用户1553248

对不起,标题令人困惑,我要尝试的是跟踪异步执行的方法引发异常的次数,同时还将成功执行的结果检索到类变量中。我认为我的实现尚不完善,在这里,CompletableFutures列表比List的CompletableFuture更合适吗?

public class testClass {

    private List<Integer> resultNumbers;

    public void testMethod() {

        int exceptions = 0;
        try {
            methodWithFuture();
        catch (InterruptedException | ExecutionException e) {
            exceptions++;
        }
        System.out.println("Number of times the addNumber method threw an exception=" + exceptions);
    }

    public void methodWithFuture() throws InterruptedException, ExecutionException {

        List<Integer> numbersList = Arrays.asList(new Integer[] { 1, 2, 3 })
        CompletableFuture<List<Integer>> futuresList = CompletableFuture.supplyAsync(() -> 
            numbersList.parallelStream().map(number -> addNumber(number))).collect(Collectors.toList()),
            new ForkJoinPool(3));

        resultNumbers.addAll(futuresList.get());
    }
}

因此,查看您的代码最多只能获得1个异常。对于对addNumber的每次调用,一个更好的CompletableFuture调用。然后检查是否异常。

public void testMethod(){

    int exceptions = 0;

    List<Integer> numbersList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13);
    List<CompletableFuture<Integer>> cfList = new ArrayList<>();

    for(int number : numbersList){
        CompletableFuture<Integer> cf = methodWithFuture(number);
        cfList.add(cf);
    }

    CompletableFuture<Void> allOfCF = CompletableFuture.allOf(cfList.toArray(new CompletableFuture[0]));       
    try {allOf.get();} catch (InterruptedException | ExecutionException ignored) {}

    int sum = 0;
    for(CompletableFuture<Integer> cf : cfList){
        if(cf.isCompletedExceptionally()){
            exceptions ++;
        } else {
            sum += cf.get();
        }
    }

    System.out.println("Number of times the addNumber method threw an exception=" + exceptions);
    System.out.println("SUM " + sum);
}


public CompletableFuture<Integer> methodWithFuture(int number) {
    return CompletableFuture.supplyAsync(() -> addNumber(number));
}

在这里,我已将每个调用addNumber异步提交,并在使用完成后等待将它们全部加入allOf

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

Java 8:如何使用流中的异常抛出方法?

来自分类Java

从并行流中的Java 8收集

来自分类Java

Java 8 | HashMap的并行流

来自分类Java

Java 8并行流问题

来自分类Java

如何从Java 8流中引发CHECKED异常?

来自分类Java

处理流Java 8中的异常

来自分类Java

代码抛出异常时,如何使用Java 8 CompletableFuture进行异常处理?

来自分类Dev

Java 8 CompletableFuture的异常行为异常方法

来自分类Dev

Java 8使用CompletableFuture :: join维护流顺序

来自分类Dev

流并行内的Java 8流

来自分类Java

CompletableFuture在Java8

来自分类Dev

Java 8中的异步方法和并行执行的方法

来自分类Dev

如何为Java 8并行流指定ForkJoinPool?

来自分类Java

Java 8并行流中的自定义线程池

来自分类Java

为什么在Java 8中按顺序收集并行流

来自分类Dev

Java 8中意外的并行流性能

来自分类Java

更新原子元素使用Java 8并行流从地图检索

来自分类Java

Java 8:并行FOR循环

来自分类Dev

如何避免 Java 8 中的多个流

来自分类Java

如何使用流编写它?Java 8

来自分类Dev

AsyncResponse和Java 8并行流问题

来自分类Java

的java 8并行流混乱/问题

来自分类Java

Java 8并行流并发分组

来自分类Java

Java 8并行流和ThreadLocal

来自分类Java

Java 8流串行与并行性能

来自分类Dev

java 8并行流,blockingcode可能吗?

来自分类Dev

Java 8并行流与ForkJoinPool和ThreadLocal

来自分类Java

并行流提供空项目,如何在Java 8中执行

来自分类Dev

使用大型并行Java 8流时如何防止堆空间错误