In this chapter, you learned the different mechanisms that you can use to work with tasks that return a result. These tasks are based on the
Callable interface, which declares the
call() method. This is a parameterized interface with the class returned by the call method.
When you execute a
Callable task in an executor, you will always obtain an implementation of the
Future interface. You can use this object to cancel the execution of the task, know if the task has finished its execution, or get the result returned by the
Callable tasks to the executor using three different methods. With the
submit() method, you send one task, and you will immediately get a
Future object associated with this task. With the
invokeAll() method, you send a list of tasks and will get a list of
Future objects when all the tasks have finished their execution. With the
invokeAny() method, you send a list of tasks, and you will receive the result (not a
Future object) of the first task...