sirve que para hilos example ejemplo java synchronization

hilos - para que sirve future en java



¿Qué hace el ''resultado'' en ExecutorService.submit(tarea ejecutable, resultado T)? (3)

No hace nada con el resultado, solo lo sostiene. Cuando la tarea se complete con éxito, al llamar a future.get() se devolverá el resultado que haya pasado.

Aquí está el código fuente de Executors $ RunnableAdapter, que muestra que después de que se haya ejecutado la tarea, se devuelve el resultado original:

static final class RunnableAdapter<T> implements Callable<T> { final Runnable task; final T result; RunnableAdapter(Runnable task, T result) { this.task = task; this.result = result; } public T call() { task.run(); return result; } }

Y sí, el tipo genérico del resultado debe coincidir con el del futuro devuelto.

Mirando a los javadocs solo dice

<T> Future<T> submit(Runnable task, T result)

Envía una tarea ejecutable para su ejecución y devuelve un futuro que representa esa tarea. El método de obtención del futuro devolverá el resultado dado una vez que se complete con éxito.

Parámetros:

tarea - la tarea a enviar

resultado - el resultado para volver

¿Pero qué hace con el resultado? ¿Almacena algo allí? ¿solo usa el tipo de resultado para especificar el tipo de Future<T> ?


Puede mutar el objeto que se pasó durante la tarea. Por ejemplo:

final String[] mutable = new String[1]; Runnable r = new Runnable() { public void run() { mutable[0] = "howdy"; } }; Future<String[]> f = executorService.submit(r, mutable); String[] result = f.get(); System.out.println("result[0]: " + result[0]);

Cuando ejecuto este código sale:

result[0]: howdy


Runnable no devuelve nada y Future debe devolver algo, por lo que este método le permite predefinir el resultado del futuro devuelto.

Si no quiere devolver una cosa, puede devolver nula y creo que el tipo Void existe para expresar ese tipo de cosas.

Future<Void> myFuture = executor.submit(myTask, null);

Sabes que myFuture.get() devolverá el null en este caso, pero solo después de que se haya ejecutado la tarea, por lo que lo myFuture.get() para esperar y lanzar cualquier excepción que arrojara la tarea.

try { myFuture.get(); // After task is executed successfully ... } catch (ExecutionException e) { Throwable c = e.getCause(); log.error("Something happened running task", c); // After task is aborted by exception ... }