Quelle est la différence entre le Futur et le FutureTask en Java?
Car l'utilisation ExecutorService
peut submit
un Callable
tâche et le retour d'un Future
, pourquoi faut-il utiliser FutureTask
pour envelopper Callable
tâche et d'utiliser la méthode execute
? Je me sens ils font tous les deux la même chose.
Vous devez vous connecter pour publier un commentaire.
En fait, vous avez raison. Les deux approches sont identiques. En général, vous n'avez pas besoin d'emballer vous-même. Si vous êtes, vous êtes susceptible de dupliquer le code dans AbstractExecutorService:
La seule différence entre le Futur et le RunnableFuture, est la méthode run ():
Une bonne raison pour laisser l'Exécuteur construire le FutureTask pour vous est de s'assurer qu'il n'est pas possible de plus d'une référence à l'FutureTask instance. C'est, à l'Exécuteur testamentaire possède cette instance.
FutureTask
Cette classe fournit un
base implementation of Future
, avec des méthodes permettant de démarrer et d'annuler un calculL'avenir est l'interface
Future
est juste l'interface. Derrière la scène, de la mise en œuvre estFutureTask
.Vous pouvez utiliser absolument
FutureTask
manuellement, mais vous perdrez les avantages de l'utilisation deExecutor
(mise en commun de thread, de limiter le fil, etc). À l'aide deFutureTask
est assez similaire à l'aide de l'ancienThread
et à l'aide de la exécuter méthode.Vous n'aurez qu'à utiliser FutureTask si vous souhaitez modifier son comportement ou accéder à son Appelable plus tard. Pour 99% des utilisations, il suffit d'utiliser Exigible et de l'Avenir.
En tant que Marque, et les autres, répondu que
Future
est l'interface pourFutureTask
etExecutor
efficacement de son usine, ce qui signifie que le code de l'application rarement instancieFutureTask
directement. Pour compléter la discussion, je fournis un exemple montrant une situation oùFutureTask
est construit et utilisé directement, en dehors de touteExecutor
:Ici,
FutureTask
est utilisé comme un outil de synchronisation, commeCountdownLatch
ou similaire barrière primitive. Il pourrait avoir été re-mises en œuvre par l'aide deCountdownLatch
ou des serrures et des conditions;FutureTask
il fait juste bien encapsulée, auto-explicatif, élégant et avec moins de code.Également noter que FutureTask#méthode run() doit être appelée explicitement, dans l'un des threads; il n'y pas d'Exécuteur testamentaire autour de le faire pour vous. Dans mon code, il est finalement exécutée par le thread principal, mais on peut modifier
get()
méthode à appelerrun()
sur le premier thread appelantget()
, donc le premier thread atteindreget()
, et il peut être tout de T1, T2 ou T3, serait de faire le calcul pour tous les autres threads.Sur cette idée - premier thread demandant résultat serait de faire le calcul pour les autres, tandis que les tentatives simultanées serait bloqué, est fondée Memoizer, voir Memoizer Cache exemple à partir de la page 108 dans "la Java de la Simultanéité dans la Pratique".