el uso de Java en FutureTask

el uso de Java en FutureTask

sobre FutureTask

FutureTask se introduce una clase de Java 5, se puede observar a partir de un nombre de FutureTask futuro, también es una tarea.

Nos fijamos en la definición de FutureTask:

public class FutureTask<V> implements RunnableFuture<V> {
    ...
}
复制代码
public interface RunnableFuture<V> extends Runnable, Future<V> {
    /**
     * Sets this Future to the result of its computation
     * unless it has been cancelled.
     */
    void run();
}
复制代码

interfaces de RunnableFuture FutureTask realizadas, interfaz RunnableFuture Ejecutable es un complejo y futuro de.

Como futuro, FutureTask puede realizar el cálculo asíncrono, se puede comprobar si un programa asíncrono está terminado y puede comenzar y cancelar el programa, y ​​obtener los resultados finales del programa de aplicación.

Además, también se proporciona un método un FutureTask, runAndReset (), el proceso se puede ejecutar estado de la tarea y restablecer el futuro.

conversión Callable y Ejecutable

Exigible sabemos que hay un valor de retorno, pero Ejecutable hay valor de retorno. Executors proporciona muchos métodos útiles para convertir Ejecutable Callable:

    public static <T> Callable<T> callable(Runnable task, T result) {
        if (task == null)
            throw new NullPointerException();
        return new RunnableAdapter<T>(task, result);
    }
复制代码

FutureTask interna que comprende un rescatable, y puede aceptar como constructor rescatable y Ejecutable:

    public FutureTask(Callable<V> callable) {
        if (callable == null)
            throw new NullPointerException();
        this.callable = callable;
        this.state = NEW;       // ensure visibility of callable
    }
复制代码
    public FutureTask(Runnable runnable, V result) {
        this.callable = Executors.callable(runnable, result);
        this.state = NEW;       // ensure visibility of callable
    }
复制代码

Su interior se llama Executors.callable (ejecutable, resultado); métodos de conversión.

Ejecutable para funcionar

Dado que es un Ejecutable, entonces FutureTask puede ejecutar hilos de una manera, nos fijamos en un ejemplo:

@Test
    public void convertRunnableToCallable() throws ExecutionException, InterruptedException {
        FutureTask<Integer> futureTask = new FutureTask<>(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
               log.info("inside callable future task ...");
                return 0;
            }
        });

        Thread thread= new Thread(futureTask);
        thread.start();
        log.info(futureTask.get().toString());
    }
复制代码

El ejemplo anterior se basa en un solo hilo para hacer lo mismo, que también se pueden enviar a la agrupación de hebras FutureTask para ejecutar:

    @Test
    public void workWithExecutorService() throws ExecutionException, InterruptedException {
        FutureTask<Integer> futureTask = new FutureTask<>(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                log.info("inside futureTask");
                return 1;
            }
        });
        ExecutorService executor = Executors.newCachedThreadPool();
        executor.submit(futureTask);
        executor.shutdown();
        log.info(futureTask.get().toString());
    }
复制代码

Ejemplos descritos en el presente documento puede hacer referencia a github.com/ddean2009/l ...

Por favor refiérase a más tutoriales Blog de flydean

Supongo que te gusta

Origin juejin.im/post/5e7f06c36fb9a03c6a41540b
Recomendado
Clasificación