Comment gérer TimeoutException avec ExecutorService et des contrats à Terme?
J'ai l'exemple de code suivant et disons que MyCallable("B")
prend plus d'une seconde pour exécuter, lorsque les autres l'exécution plus rapide d'une seconde. Donc à l'intérieur de ma boucle qui appelle Future.get()
, il va lancer une TimeoutException
.
public static void main(String[] args) {
ExecutorService es = Executors.newFixedThreadPool(2);
List<Future<String>> futures = new ArrayList<Future<String>>();
futures.add(es.submit(new MyCallable("A")));
futures.add(es.submit(new MyCallable("B")));
futures.add(es.submit(new MyCallable("C")));
futures.add(es.submit(new MyCallable("D")));
futures.add(es.submit(new MyCallable("E")));
try {
for(Future<String> f : futures) {
try {
System.out.println("result " + f.get(1, TimeUnit.SECONDS));
}
catch (TimeoutException e) {
//how do I know which MyCallable() has timed out?
} catch (ExecutionException e) {
System.out.println(e.getMessage());
}
}
}
catch (InterruptedException e) {
e.printStackTrace();
}
finally {
es.shutdown();
}
}
Comme prévu chacune des MyCallable() les instances de l'exécution, mais pour une fois que je voudrais effectuer une gestion d'erreur et que cela nécessite de savoir qui Callable
est associé avec qui Future
.
Est-il un mécanisme pour cette association ou est-il à la hauteur de mes Callable
de gérer toutes les erreurs de traitement à l'intérieur c'est call()
méthode?
Vous devez vous connecter pour publier un commentaire.
Semble que vous pourriez tout simplement maintenir un
Map<Future<String>, Callable<String>>
au lieu d'unList<Future<String>>
et de récupérer l'original Appelable de cette façon.Si vous souhaitez obtenir vraiment intelligent, vous pourriez le faire OO de style et d'étendre ThreadPoolExecutor et de créer un Avenir décorateur de classe. Je pense que c'est probablement excessif, mais vous pouvez le faire comme ceci:
Et puis:
Map<Future<String>, Callable<String>>
est l'option la plus simple et fonctionnepublic class TimeoutException
s'étend Exception
Exception levée lorsqu'une opération de blocage arrive à expiration. Le blocage des opérations pour lesquelles un délai d'attente spécifié besoin d'un moyen pour indiquer que le délai d'attente a eu lieu. Pour beaucoup de ces opérations, il est possible de retourner une valeur qui indique le délai d'attente; lorsque cela n'est pas possible ou souhaitable alors TimeoutException doivent être déclarés et jeté.