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