Question

Je suis tout à fait nouveau aux services executer. Ai tout aimé faire moi-même, mais je pense qu'il est temps de faire confiance à ces services.

Je veux la main par un Executer Runnable. Les enveloppements Executer que dans un FutureTask et les mains en arrière pour moi. Maintenant, j'appelle la méthode de sondage done(). Mais je voudrais être informé alors la méthode done() retournerait vrai.

Il existe une méthode de get() qui bloque jusqu'à ce que le Runnable a terminé, mais alors je besoin d'un fil supplémentaire pour chaque emploi, juste pour voir quand il est fini.

Puis-je ma main executer un peu de Callable supplémentaire pour être averti de la finition des tâches?

Quelle est la façon d'y aller? Je pourrais ajouter un code à la fin de la méthode run, mais peut-être encore done() faux ...

Était-ce utile?

La solution

Si vous pouvez faire une hypothèse spécifique d'utiliser un java.util.concurrent.ThreadPoolExecutor, vous pouvez utiliser ses méthodes de crochet; afterExecute () et beforeExecute ().

http://download.oracle. com / JavaSE / 6 / docs / api / java / util / concurrent / ThreadPoolExecutor.html

Ils ne sont pas aussi élégant que le ListenableFuture, mais il pourrait être une solution adéquate à condition que vous avez besoin d'un seul type d'un « auditeur » pour une instance d'exécuteur testamentaire donné.

Autres conseils

Si vous voulez faire une tâche après l'autre de son mieux pour le faire dans le même fil.

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

De cette façon, il fera tout ce que vous voulez faire après la runnable dans le même fil et vous ne avez pas besoin de sondage ou utiliser un autre fil.

Je vous conseille de jeter un oeil à la page com.google.common.util.concurrent package Goyave , en particulier la ListenableFuture type et le code lié.

Une fois que la prochaine version (r10) est sorti, il sera facile de créer un ExecutorService qui retourne à l'aide ListenableFutures MoreExecutors.listeningDecorator (ExecutorService) . Vous pouvez également actuellement envelopper vos Runnables / Callables dans ListenableFutureTask vous.

final ListenableFutureTask<?> task = new ListenableFutureTask<Object>(
    runnable, null);
executor.submit(task);
task.addListener(new Runnable() {
  public void run() {
    // do whatever
  }
}, listenerExecutor);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top