2011-06-14 16 views
9

Soy bastante nuevo en los servicios de ejecución. Me gustó hacer todo yo mismo, pero creo que es hora de confiar en estos servicios.Java Exllamable Callable FutureTask: Cómo escuchar la tarea terminada

Quiero pasar por Executer a Runnable. El ejecutador lo ajusta en un FutureTask y me lo devuelve. Ahora llamo encuesta el método done(). Pero me gustaría recibir una notificación cuando el método done() sea verdadero.

Hay un método get() que bloquea hasta que el Runnable haya terminado, pero entonces necesitaría un hilo adicional para cada trabajo, solo para ver cuándo está terminado.

¿Puedo entregar mi ejecutor un poco más Callable para recibir notificaciones sobre el acabado de la tarea?

¿Cuál es el camino a seguir aquí? Podría agregar un código al final del método run, pero luego done() podría ser falso ...

Respuesta

3

Si desea hacer una tarea tras otra, es mejor hacerlo en el mismo hilo.

Executor executor = 
final Runnable runnable = 
executor.execute(new Runnable() { 
    public void run() { 
     runnable.run(); 
     // do something after the run() has finished. 
    } 
}); 

De esta manera será hacer lo que quiere hacer después de que el ejecutable en el mismo hilo y que no es necesario para sondear o utilizar otro hilo.

+0

También tengo la pregunta de subprocesos [aquí] (http://stackoverflow.com/questions/29130563/how-can-i-terminate-tasks-hathathave-timed-out-in-multithreading/). No estoy seguro de cómo debo usar cancelar en mi tarea futura, así que quería consultar con usted sobre eso. Si es posible, puedes ayudarme allí. – john

3

me aconsejan tomar un vistazo al paquete com.google.common.util.concurrent en Guava, específicamente el tipo ListenableFuture y el código relacionado con él.

Una vez que salga la próxima versión (r10), será fácil crear un ExecutorService que devuelva ListenableFuture utilizando MoreExecutors.listeningDecorator(ExecutorService). También puede envolver sus Runnable s/Callable en un ListenableFutureTask usted mismo.

final ListenableFutureTask<?> task = new ListenableFutureTask<Object>(
    runnable, null); 
executor.submit(task); 
task.addListener(new Runnable() { 
    public void run() { 
    // do whatever 
    } 
}, listenerExecutor); 
+0

¿No es esta una manera complicada del enfoque de Peter Lawrey? – irreputable

+0

Tal vez con ese decorador podría ser un buen código. ¿Cuándo viene v.10? ¿Hay alguna versión beta para descargar? –

+0

@irreputable: en el enfoque de Peter, el manejo de qué hacer después de que la tarea finalice se agrupa como parte de la tarea que se envía al ejecutor. Si la tarea se cancelara, por ejemplo, no se enteraría. Como está escrito, una excepción en el 'run()' del delegado también causaría que la parte no se ejecute. Además, estás atando las cosas que suceden después al mismo hilo que la tarea en sí misma, que quizás no desees. – ColinD

Cuestiones relacionadas