Cómo crear un futuro completo en java


83

¿Cuál es la mejor manera de construir un futuro completo en Java? He implementado el mío a CompletedFuturecontinuació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();
    }
}

1
¡La mejor manera es no crear uno! ;-) ¿Por qué necesita implementar un futuro? ¿No puedes usar objetos existentes que devuelven un futuro en su lugar?
Assylias

1
Sospecho que no existe ninguno porque nunca he visto una razón para tener uno. ¿Quizás podría explicar lo que está tratando de hacer?
Peter Lawrey

1
@PeterLawrey Supongo que lo necesita para alguna API que, por alguna razón retorcida, quiere trabajar con futuros a pesar de que realmente solo necesita sus valores. O lo necesita para burlarse. Al menos esas son las únicas razones que puedo imaginar.
Cubic

9
Las pruebas unitarias serían una razón perfectamente válida para querer esto: un servicio simulado que devuelve un futuro con valores de prueba.
Louis Wasserman

3
@Cúbico. ¿Qué tal si tuviera un método que acepta un <T> invocable y quién puede o no ejecutar el trabajo de forma asincrónica dependiendo de los recursos disponibles u otros factores, como las opciones que ya se han proporcionado mucho antes? Imagínese si Executor.execute (Runnable) tomara un Callable <T> como parámetro y decidiera ejecutarlo en el hilo de ejecución, ¿no necesitaría la implementación crear su propio Future <T> entonces?
Martin Andersson

Respuestas:


65

Apache Commons Lang define una implementación similar que se llama ConstantFuture, puede obtenerla llamando a:

Future<T> future = ConcurrentUtils.constantFuture(T myValue);

Vea la respuesta de Andrejs a continuación, podría ser más de lo que está buscando
nathanfranke

195

En Java 8 puede utilizar el CompletableFuture integrado:

 Future future = CompletableFuture.completedFuture(value);

Esto le daría un futuro completo. En su lugar, use new CompletableFuture ().
zafar142003

8
@ zafar142003 OP pidió un futuro completo, ¿no?
Andrejs

a juzgar por la clase en los detalles de la pregunta (en 2012), creo que el OP quería una implementación 'CompletableFuture'. Pero supongo que ahora es un punto discutible.
zafar142003

A juzgar por la clase en los detalles de la pregunta, parece que OP quería un futuro con un valor inmediato. Ver que isDonesiempre devuelve verdadero. Por tanto, esta es una excelente respuesta.
nathanfranke


2
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();

-3

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.


2
Generalmente, usar cualquier cosa en el 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.
James Kingsbery

-6

En Java 6 puede utilizar lo siguiente:

Promise<T> p = new Promise<T>();
p.resolve(value);
return p.getFuture();

3
No creo que esté en las bibliotecas centrales de Java. ¿Qué dependencia externa utiliza?
Jorn
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.