Quand dois-je utiliser un CompletionService sur un ExecutorService?

Je viens de trouver CompletionService dans ce blog. Cependant, ce n'est pas vraiment présente les avantages de CompletionService sur une norme ExecutorService. Le même code peut être écrit avec les deux. Donc, quand on est un CompletionService utile?

Pouvez-vous donner un court exemple de code pour faire ce cristal clair? Par exemple, cet exemple de code montre où un CompletionService n'est pas nécessaire (=équivalent à ExecutorService)

    ExecutorService taskExecutor = Executors.newCachedThreadPool();
    //       CompletionService<Long> taskCompletionService =
    //               new ExecutorCompletionService<Long>(taskExecutor);
    Callable<Long> callable = new Callable<Long>() {
        @Override
        public Long call() throws Exception {
            return 1L;
        }
    };

    Future<Long> future = //taskCompletionService.submit(callable);
        taskExecutor.submit(callable);

    while (!future.isDone()) {
        //Do some work...
        System.out.println("Working on something...");
    }
    try {
        System.out.println(future.get());
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
InformationsquelleAutor ripper234 | 2011-02-06