If we use an ExecutorCompletionService we can submit a series of tasks as Callables and get the result interacting with the CompletionService as a
Comparing by Considering only the Order of Results:
When we use CompletionService whenever a job submitted is finished the result will be pushed to the queue (Completion Order). Then the order of the submitted jobs and the returned results is no more same. So if you are concerned about the order which tasks got executed use CompletionService
Where As invokeAll returns a list of Futures representing the tasks, in the same sequential order as produced by the iterator for the given task list, each of which has completed.