54 votes

Quand devrions-nous utiliser Thread over Executor de Java?

L'exécuteur semble être une abstraction pure. Quand voudriez-vous utiliser Thread directement plutôt que de vous fier à un exécuteur plus robuste?

30voto

Pablojim Points 4367

Pour donner un peu d’historique, les exécuteurs n’ont été ajoutés qu’au standard Java de Java 1.5. Ainsi, à certains égards, les exécuteurs peuvent être considérés comme une nouvelle meilleure abstraction pour traiter les tâches exécutables.

Un peu trop de simplification à venir ... - Les exécuteurs sont des fils bien faits, utilisez-les donc de préférence.

8voto

kd304 Points 8369

J'ai utiliser le Thread quand j'ai besoin d'un pull en fonction de traitement des messages. E. g. une File d'attente est de prendre()-fr en boucle dans un thread séparé. Par exemple, vous envelopper d'une file d'attente dans un coûteux contexte permet de dire d'une connexion JDBC, JMS, connexion, les fichiers à traiter à partir d'un seul disque, etc.

Avant que je sois maudit, avez-vous du scénario?

Edit:

Comme indiqué par d'autres, l' Executor (ExecutorService) interface a plus de potentiel, que vous pouvez utiliser l' Executors pour sélectionner un comportement: planifié, en priorité, la mise en cache etc. dans Java 5+ ou un "j".u.c backport pour Java 1.4.

L'exécuteur cadre de la protection contre écrasé runnables et automatiquement re-créer les threads de travail. Un seul inconvénient à mon avis, que vous avez explicitement shutdown() et awaitTermination() avant de quitter votre application - qui n'est pas facile dans les applications à interface graphique. Si vous utilisez délimitée files d'attente, vous devez spécifier un RejectedExecutionHandler ou la nouvelle runnables sont jetés.

Vous pourriez avoir un coup d'oeil à Brian Goetz et al: la Java de la Simultanéité dans la Pratique (2006)

5voto

skaffman Points 197885

L'utilisation de threads bruts ne présente aucun avantage. Vous pouvez toujours fournir aux exécuteurs une fabrique de threads, de sorte que même l'option de création de thread personnalisé est couverte.

3voto

nojevive Points 1030

Vous n'utilisez pas Thread sauf si vous avez besoin d'un comportement plus spécifique que celui trouvé dans Thread lui-même. Vous étendez ensuite Thread et ajoutez votre comportement spécifiquement recherché.

Sinon, utilisez simplement Runnable ou Executor.

3voto

SoulWanderer Points 195

Eh bien, j'ai pensé qu'une ThreadPoolExecutor fourni de meilleures performances pour elle gère un pool de threads, réduire la surcharge de l'instanciation d'un nouveau fil de discussion, l'allocation de mémoire...

Et si vous allez lancer des milliers de threads, il vous donne un peu de files d'attente de la fonctionnalité que vous auriez à le programme par vous-même...

Filetage & Exécuteurs sont différents outils, utilisés sur différents scénarios... Comme je le vois, c'est comme demander pourquoi devrais-je utiliser ArrayList quand je peux utiliser la table de hachage? Ils sont différents...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X