¿Cuál es la mejor manera de construir un futuro completo en Java? He implementado el mío a CompletedFuture
continuación, pero esperaba algo como esto que ya existe.
public class CompletedFuture<T> implements Future<T> {
private final T result;
public CompletedFuture(final T result) {
this.result = result;
}
@Override
public boolean cancel(final boolean b) {
return false;
}
@Override
public boolean isCancelled() {
return false;
}
@Override
public boolean isDone() {
return true;
}
@Override
public T get() throws InterruptedException, ExecutionException {
return this.result;
}
@Override
public T get(final long l, final TimeUnit timeUnit) throws InterruptedException, ExecutionException, TimeoutException {
return get();
}
}
Respuestas:
Apache Commons Lang define una implementación similar que se llama ConstantFuture, puede obtenerla llamando a:
fuente
En Java 8 puede utilizar el CompletableFuture integrado:
fuente
isDone
siempre devuelve verdadero. Por tanto, esta es una excelente respuesta.Guava define
Futures.immediateFuture(value)
, que hace el trabajo.fuente
FutureTask<String> ft = new FutureTask<>(() -> "foo"); ft.run(); System.out.println(ft.get());
imprimirá "foo";
También puede tener un Future que arroja una excepción cuando se llama a get ():
FutureTask<String> ft = new FutureTask<>(() -> {throw new RuntimeException("exception!");}); ft.run();
fuente
Encontré una clase muy similar a la tuya en Java rt.jar
com.sun.xml.internal.ws.util.CompletedFuture
También le permite especificar una excepción que se puede lanzar cuando se invoca get (). Simplemente configúrelo en nulo si no desea lanzar una excepción.
fuente
com.sun.*
paquete no es una gran idea. Por lo general, esas clases se consideran un detalle de implementación interno y pueden cambiar entre las versiones de Java.En Java 6 puede utilizar lo siguiente:
Promise<T> p = new Promise<T>(); p.resolve(value); return p.getFuture();
fuente