2016-08-04 1 views
0

En java je veux exécuter plusieurs threads et obtenir la réponse de retour de tous. Le problème que j'ai est si un des threads jette une exception quand je fais le String temp = r.get() il tombe dans le catch et ne me donne pas la réponse des threads restants.Lorsque vous utilisez le ExecutorService.invokeAll est-il un moyen d'obtenir toutes les réponses, même si une exception est survenue

Est-il possible de traiter toutes les réponses indépendamment du fait que le fil individuel a lancé une exception?

Mon code de test est

ExecutorService es = Executors.newFixedThreadPool(2); 
    List<CallTest> callList = new ArrayList<>(); 

    callList.add(new CallTest(1)); 
    callList.add(new CallTest(2)); 
    callList.add(new CallTest(3)); 
    callList.add(new CallTest(4)); 


    try { 
     List<Future<String>> returns = es.invokeAll(callList); 
     for (Future<String> r : returns) { 
      String temp = r.get(); 
      System.out.println("returned " + temp); 

     } 
    } catch (InterruptedException e) { 
     System.out.println("Interrupted Exception catch"); 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     System.out.println("Execution Exception catch"); 
     e.printStackTrace(); 

    } 
+3

Mettre le try-catch autour de l'individu 'r.get()' au lieu de la boucle entière? – RealSkeptic

Répondre

0

Catch exceptions dans la boucle

for (Future<String> r : returns) { 
    try { 
     String temp = r.get(); 
     System.out.println("returned " + temp); 
    } catch (InterruptedException e) { 
     System.out.println("Interrupted Exception catch"); 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     System.out.println("Execution Exception catch"); 
     e.printStackTrace(); 
    } 
} 
+0

Merci pour cela, en tant que nouveau venu relativement à Java (de Cobol de toutes choses) où mettre le try/catch n'est pas toujours évident – Anthony

0

Autre solution:

Remplacer méthode afterExecute dans ThreadPoolExecutor

protected void afterExecute(Runnable r, 
       Throwable t) 

Méthode invoquée à la fin de l'exécution du Runnable donné. Cette méthode est appelée par le thread qui a exécuté la tâche. Si non-null, Throwable est la RuntimeException non interceptée ou l'erreur qui a provoqué l'arrêt brutal de l'exécution.

exemple de code d'lien de documentation oracle:

class ExtendedExecutor extends ThreadPoolExecutor { 
    // ... 
    protected void afterExecute(Runnable r, Throwable t) { 
    super.afterExecute(r, t); 
    if (t == null && r instanceof Future<?>) { 
     try { 
     Object result = ((Future<?>) r).get(); 
     } catch (CancellationException ce) { 
      t = ce; 
     } catch (ExecutionException ee) { 
      t = ee.getCause(); 
     } catch (InterruptedException ie) { 
      Thread.currentThread().interrupt(); // ignore/reset 
     } 
    } 
    if (t != null) 
     System.out.println(t); 
    } 
}