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