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?

InformationsquelleAutor Brad | 2012-08-27