Quand doit-on utiliser Java du Fil sur Exécuteur testamentaire?
Exécuteur semble propre à l'abstraction. Quand vous voulez utiliser le Thread directement, plutôt que de compter sur le plus robuste exécuteur testamentaire?
Vous devez vous connecter pour publier un commentaire.
Pour donner un peu d'histoire, les Exécuteurs testamentaires ont été ajoutées dans le cadre de la norme java dans Java 1.5. Donc, à certains égards, les Liquidateurs peuvent être vu comme une nouvelle meilleure abstraction pour traiter les tâches Exécutables.
Un peu d'une simplification à venir... - les Exécuteurs sont les threads fait droit, de manière à utiliser de préférence.
Je utiliser le Fil 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?
Modifier:
Comme indiqué par d'autres, le
Executor
(ExecutorService
) interface a plus de potentiel, que vous pouvez utiliser leExecutors
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()
etawaitTermination()
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)
Il n'y a aucun avantage à utiliser le raw threads. Vous pouvez toujours fournir des Exécuteurs testamentaires d'un Fil de l'usine, de sorte que même la possibilité de personnalisé de création de thread est couvert.
Vous n'utilisez pas de Fil, sauf si vous avez besoin de plus d'un comportement particulier qui ne se trouve pas dans le Thread lui-même. Vous alors d'étendre Fil et ajouter votre plus précisément le comportement souhaité.
D'autre juste utiliser Praticable ou l'Exécuteur testamentaire.
Bien, j'ai pensé qu'un 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...
Fils & 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...
java.util.simultanées paquet fournit exécuteur testamentaire de l'interface et peut être utilisé pour créer de thread.
L'Exécuteur testamentaire de l'interface fournit une méthode unique, exécuter, conçu pour être un remplacement pour une commune de création de thread idiome. Si r est un objet Praticable, et e est l'Exécuteur testamentaire de l'objet vous pouvez remplacer
(nouveau Thread(r)).start();
avec
e.execute(r);
Reportez-vous ici
C'est toujours mieux préférer Exécuteur testamentaire à
Thread
même pour un seul thread, comme ci-dessousVous pouvez utiliser
Thread
surExecutor
dans les scénarios ci-dessousBesoins de votre application limitée thread(s) et la logique métier est simple
Si simple, multi-threading modèle qui répond à votre exigence sans Fil Piscine
Vous êtes sûr de la gestion des thread(s) du cycle de vie + la gestion des exceptions scénarios avec l'aide de l'Api de bas niveau dans les secteurs ci-dessous :
Inter thread communication, Exception handling, reincarnation of threads
due à des erreurs inattendueset un dernier point
Si votre application n'a pas besoin de personnalisation des différentes fonctions de
ThreadPoolExecutor
Dans tous les autres cas, vous pouvez aller pour
ThreadPoolExecutor