Le Multithreading au printemps
Je suis en train d'essayer d'entrer dans le printemps de multithreading et j'ai quelques questions.
J'ai praticable méthode dans ThreadRating classe. Maintenant, je ne suis pas sûr de la meilleure façon de l'utiliser.
l'option 1, je trouve:
private void updateRating() {
ExecutorService executor = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) { //test
//thread part
Runnable worker = new ThreadRating(path, i, products.get(i), dao, fileHandler);
executor.execute(worker);
}
executor.shutdown();
try {
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
log.error("There was an error when ending threads");
System.exit(1);
}
System.out.println("Finished all threads");
}
Cela semble être en cours d'exécution fine. Après la boucle for, il attend jusqu'à ce que les threads sont finis et se termine.
Deuxième option, j'ai essayé
private TaskExecutor taskExecutor;
public UpdateBO(TaskExecutor taskExecutor) {
this.taskExecutor = taskExecutor;
}
private void updateRating() {
for (int i = 0; i < 10; i++) { //test
Runnable worker = new ThreadRating(path, i, products.get(i), dao, fileHandler);
taskExecutor.execute(worker);
}
//wait for threads to be finished before you go any further ??
}
Et dans le fichier xml, j'ai
<beans:bean id="taskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<beans:property name="corePoolSize" value="5" />
<beans:property name="maxPoolSize" value="10" />
<beans:property name="queueCapacity" value="25" />
<beans:property name="waitForTasksToCompleteOnShutdown" value="true" />
</beans:bean>
<beans:bean id="updateBO" class="UpdateBO">
<beans:constructor-arg ref="taskExecutor" />
</beans:bean>
Et voici mes questions:
- Quelle est la différence entre ces deux options? La vitesse, la mémoire, les fuites possibles? Ou sont-ils la même juste écrit différemment?
- Ai-je besoin de l'arrêt de la piscine lors de l'utilisation d'un webservice? Je sais que dans la seconde option, je n'ai pas, mais est-il de même lors de l'utilisation d'un webservice?
- Lors de l'utilisation de la deuxième option - comment devrais-je dire de l'attendre jusqu'à ce que toutes les tâches sont terminées? Dans la première option, je viens de fermer la piscine vers le bas et d'attendre à la fin. Mais dans la deuxième option, la demande de code est terminé avant que les travaux sont terminés.
executor.execute(worker);
- juste pour clarifier. Ce n'est pas réellement de la création d'un nouveau thread, mais il ajoute tâche à une file d'attente et si la file est pleine, il attend à droite sur cette ligne dans le code jusqu'à ce qu'il est libre?
Merci pour m'aider à comprendre.
La fermeture de la piscine les exécuteurs n'est pas de bonnes options, dans certains environnements comme serveur d'application activée l'option de sécurité de tentative d'arrêt de l'exécuteur sera la cause de l'exception de sécurité. Si vous avez besoin d'attendre les travailleurs jusqu'à la fin, l'utilisation
Future
s au lieu de Runnable
s.OriginalL'auteur Elis.jane | 2015-04-07
Vous devez vous connecter pour publier un commentaire.
Principale différence: dans l'option 1) vous créez de nouveaux exécuteur testamentaire sur tous les
updateRating()
appel, dans l'option 2) l'exécuteur testamentaire est créé une fois sur le déploiementtemps, vous nourrir seul et même exécuteur testamentaire avec de nouveaux emplois. La deuxième approche est beaucoup mieux.
Pourquoi avez-vous besoin d'arrêter l'exécuteur testamentaire? La création de nouveaux exécuteurs
et à la fermeture d'attendre jusqu'à ce que la tâche est traitée est antipattern. Rappelez-vous, que exécuteurs sont créés dans le but de contrôler les ressources système et devraient être traités comme tels. (E. g. vous avez DB pool de connexion de 50 connexions - donc servir DB accès vous créez exécuteur de 50 filetage - pour éviter de limite de connexion dépasser. Ou vous avez de 24 cœurs sur le serveur et le besoin de paralléliser le travail de la meilleure façon possible).
Et, comme je l'ai mentionné dans un commentaire, dans certains environnements (tels que les serveurs d'application) souvent, vous n'avez pas les droits d'arrêter l'exécuteur testamentaire. Une telle tentative de produire
SecurityException
.Si vous avez besoin d'attendre jusqu'à ce que les travailleurs terminent leurs travaux, enveloppez chaque travail avec
Callable
au lieu deRunnable
, puis à partir de thread principal appel correspondantfuture.get()
- et il permet de bloquerjusqu'à ce travail de finitions. Les délais d'expiration sont pris en charge. Exemple
Absolument droit. Les Threads sont créés et détruits par l'exécuteur lui-même, quand il pense est le meilleur moment pour. Essayer de contrôler votre application avec jvisualvm pour voir comment ça se passe.
Pas exactement. Un bean - une classe. Pour un autre classes qui ont besoin de cette exécuteur testamentaire, vous devez définir un autre haricots, en passant cet exécuteur bean en argument du constructeur.
OriginalL'auteur Alex Salauyou
1.) L'Option 1 est mal mis en œuvre depuis vous de définir votre exécuteur service local et le fermer après chaque utilisation. Cela va à l'encontre de la finalité de la création d'un pool de threads - il doit être un objet global, de sorte que l'Option 2 est le chemin à parcourir.
2.) Vous n'avez pas besoin d'arrêter l'exécuteur de service lors de l'appel d'un service web. Si le webservice ne répond pas à l'appel finira par le temps et le fil remplir d'exécution. Si vous arrêtez l'exécuteur de service, il ne sera pas disponible pour le prochain appel.
3.) Si vous avez besoin d'une certaine forme de notification une fois que votre fil est finised, vous devez utiliser Callable en conjonction avec Futures à la place.
4.) Votre exécuteur testamentaire de service a un maximum de 10 threads alloués, il ne fraie pas plus que ceux. Si tous sont occupés, vous la tâche sera inactif jusqu'à ce que l'un de ces fils devient disponible.
et en fait je n'ai pas besoin de notification, il suffit d'attendre pour eux à la fin. Les contrats à terme ne semble faire que pour les Exécutables.
OriginalL'auteur Fritz Duchardt