2017-01-26 2 views
2

Извините за запутанное название, то, что я пытаюсь отслеживать количество раз, когда метод, который выполняется асинхронно, выдает исключение, а также получение результатов, успешно выполненных в переменной класса. Я думаю, что моя реализация довольно неактивна, будет ли здесь более подходящий список CompletingFutures, чем CompletableFuture of List?Java 8 - Как отслеживать количество исключений, вызванных в параллельном потоке async, используя 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

Так, глядя на ваш текущий код, который вы только когда-нибудь, чтобы получить 1 исключение в большинстве – Ash

ответ

1

Так что, глядя на ваш код, вы получите только 1 исключение. Лучший CompletableFuture вызов для каждого вызова addNumber. Затем проверьте, является ли это исключительным.

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

Смежные вопросы