java appelable FutureTask Exécuteur: Comment écouter une tâche terminée
-
27-10-2019 - |
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 ...
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 ().
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 ListenableFuture
s MoreExecutors.listeningDecorator (ExecutorService) . Vous pouvez également actuellement envelopper vos Runnable
s / Callable
s dans ListenableFutureTask vous.
final ListenableFutureTask<?> task = new ListenableFutureTask<Object>(
runnable, null);
executor.submit(task);
task.addListener(new Runnable() {
public void run() {
// do whatever
}
}, listenerExecutor);