o uso de java em FutureTask

o uso de java em FutureTask

Sobre FutureTask

FutureTask um java classe 5 é introduzido, ele pode ser visto tanto um nome FutureTask Futuro, também uma tarefa.

Nós olhamos para a definição 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 realizados, a interface RunnableFuture Runnable é um complexo e Futuro da.

Como Futuro, FutureTask pode realizar computação assíncrona, você pode verificar se um programa assíncrona é concluída e pode começar e cancelar o programa, e obter os resultados finais do programa de implementação.

Além disso, um método também é fornecido um FutureTask, runAndReset (), o processo pode ser executado estado de tarefa e repor o futuro.

conversão mobilizável e Execut�el

Mobilizável sabemos que há um valor de retorno, mas Runnable é nenhum valor de retorno. Executores fornece muitos métodos úteis para converter Runnable mobilizável:

    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 compreende uma mobilizável, e pode aceitar como um construtor mobilizável e Runnable:

    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
    }
复制代码

O seu interior é chamado Executors.callable (executável, resultado); métodos de conversão.

Executável para ser executado

Uma vez que é um Runnable, então FutureTask pode executar threads de uma forma, olhamos para um exemplo:

@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());
    }
复制代码

O exemplo acima é baseado em um único segmento a fazer o mesmo, também pode ser enviado para o pool de threads FutureTask para executar:

    @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());
    }
复制代码

Exemplos aqui descritos podem referenciar github.com/ddean2009/l ...

Por favor, consulte mais tutoriais de blog dos flydean

Acho que você gosta

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