Pregunta

Soy bastante nuevo en los servicios del ejecutor. Me gustó hacer todo yo mismo, pero creo que es hora de confiar en estos servicios.

Quiero pasar por Executer a Runnable. El ejecutor envuelve eso en un FutureTask y me lo devuelve. Ahora llamo encuesta el done() método. Pero me gustaría que me notificaran cuando done() El método devolvería verdadero.

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

¿Puedo entregar a mi ejecutor un poco más? Callable ¿Ser notificado sobre el acabado de la tarea?

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

¿Fue útil?

Solución

Si puede hacer una suposición específica de usar un java.util.concurrent.threadpoolexecutor, entonces puede usar sus métodos de gancho; AfterExECute () y antes de EXECHUTE ().

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/threadpoolexecutor.html

No son tan elegantes como la FUTURA ESCUCHA, pero podría ser una solución adecuada siempre que solo necesite un tipo de "oyente" para una instancia de albacea determinada.

Otros consejos

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, hará lo que quieras después del runnable en el mismo hilo y no necesitas sondear ni usar otro hilo.

Aconsejaría echar un vistazo al com.google.common.util.concurrent empaquetarse Guayaba, específicamente el Escucha de escucha escriba y el código relacionado con él.

Una vez que salga la próxima versión (R10), será fácil crear un ExecutorService que regresa ListenableFutures usando MoreExecutors.ListeningDecorator (ExecutorService). Actualmente también puede envolver su Runnables/Callables en un Escucha escucha tú mismo.

final ListenableFutureTask<?> task = new ListenableFutureTask<Object>(
    runnable, null);
executor.submit(task);
task.addListener(new Runnable() {
  public void run() {
    // do whatever
  }
}, listenerExecutor);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top