¿Cuál es la diferencia entre un futuro y una promesa?

Resuelto Evgenij Reznik asked hace 11 años • 9 respuestas

¿ Cuál es la diferencia entre Futurey Promise?
Ambos actúan como un marcador de posición para resultados futuros, pero ¿dónde está la principal diferencia?

Evgenij Reznik avatar Jan 27 '13 04:01 Evgenij Reznik
Aceptado

(No estoy completamente satisfecho con las respuestas hasta el momento, así que aquí está mi intento...)

Creo que el comentario de Kevin Wright

Puedes hacer una Promesa y depende de ti cumplirla. Cuando alguien más te hace una promesa, debes esperar para ver si la cumple en el futuro.

Lo resume bastante bien, pero alguna explicación puede ser útil.

Los futuros y las promesas son conceptos bastante similares, la diferencia es que un futuro es un contenedor de solo lectura para un resultado que aún no existe, mientras que una promesa se puede escribir (normalmente solo una vez). Java 8 CompletableFuture y Guava SettableFuture pueden considerarse promesas, porque su valor se puede establecer ("completar"), pero también implementan la interfaz Future, por lo que no hay diferencia para el cliente.

El resultado del futuro lo establecerá "alguien más", mediante el resultado de un cálculo asincrónico. Tenga en cuenta que FutureTask , un futuro clásico, debe inicializarse con Callable o Runnable, no hay un constructor sin argumentos y tanto Future como FutureTask son de solo lectura desde el exterior (los métodos establecidos de FutureTask están protegidos). El valor se establecerá según el resultado del cálculo desde el interior.

Por otro lado, "usted" (o, de hecho, cualquier persona) puede establecer el resultado de una promesa en cualquier momento porque tiene un método de establecimiento público. Tanto CompletableFuture como SettableFuture se pueden crear sin ninguna tarea y su valor se puede establecer en cualquier momento. Envía una promesa al código del cliente y la cumple más tarde como desee.

Tenga en cuenta que CompletableFuture no es una promesa "pura", se puede inicializar con una tarea como FutureTask y su característica más útil es el encadenamiento no relacionado de pasos de procesamiento.

Tenga en cuenta también que una promesa no tiene por qué ser un subtipo de futuro y no tiene que ser el mismo objeto. En Scala, un objeto Future se crea mediante un cálculo asincrónico o mediante un objeto Promise diferente . En C++ la situación es similar: el objeto prometido lo utiliza el productor y el objeto futuro el consumidor. La ventaja de esta separación es que el cliente no puede fijar el valor del futuro.

Tanto Spring como EJB 3.1 tienen una clase AsyncResult, que es similar a las promesas de Scala/C++. AsyncResult implementa Future, pero este no es el futuro real: los métodos asincrónicos en Spring/EJB devuelven un objeto Future diferente, de solo lectura, a través de algo de magia de fondo, y el cliente puede usar este segundo futuro "real" para acceder al resultado.

lbalazscs avatar Mar 02 '2015 23:03 lbalazscs

Según esta discusión , Promisefinalmente se ha solicitado CompletableFuturesu inclusión en Java 8, y su javadoc explica:

Un Futuro que puede completarse explícitamente (estableciendo su valor y estado) y puede usarse como CompletionStage, respaldando funciones y acciones dependientes que se activan tras su finalización.

También se da un ejemplo en la lista:

f.then((s -> aStringFunction(s)).thenAsync(s -> ...);

Tenga en cuenta que la API final es ligeramente diferente pero permite una ejecución asincrónica similar:

CompletableFuture<String> f = ...;
f.thenApply(this::modifyString).thenAccept(System.out::println);
assylias avatar Jan 26 '2013 22:01 assylias