Maison > Java > Comment gérer le multithreading dans ``Executor Service``java

Comment gérer le multithreading dans ``Executor Service``java

WBOY
Libérer: 2024-02-22 12:43:06
avant
609 Les gens l'ont consulté

L'éditeur PHP Youzi vous donnera la réponse : utiliser Executor Service pour gérer le multi-threading en Java est un moyen efficace de gérer efficacement le pool de threads et le cycle de vie des threads. Grâce au service Executor, vous pouvez facilement créer, démarrer et contrôler plusieurs threads pour réaliser une exécution simultanée de tâches et améliorer l'efficacité du programme. Cet article explique comment utiliser Executor Service pour gérer les problèmes multithreading en Java, vous aidant ainsi à mieux comprendre et appliquer cet important outil de traitement multithread.

Contenu de la question

Je développe une solution, pour un seul client, je dois appeler une API pour obtenir la liste des employés de ce client. Mais cette API (tierce) ne peut renvoyer que 100 employés à la fois. Je dois donc appeler la même API en modifiant le décalage à chaque fois pour obtenir le prochain groupe de 100 employés. Actuellement, cela est géré à l'aide d'un seul thread, donc le temps nécessaire pour récupérer tous les employés (disons 30 000) augmente à mesure que le nombre d'employés augmente. Et l’application compte de nombreux clients de ce type.

Pour résoudre ce problème, j'ai essayé d'implémenter le multi-threading en utilisant #executorservice. Avec cette solution, le temps nécessaire pour récupérer tous les salariés pour un client est réduit.

Question :

  1. Comment plusieurs threads (provenant de plusieurs clients) fonctionnent-ils avec un service d'exécution qui dispose de plusieurs threads pour appeler l'API ?
  2. La logique suivante dans un environnement multithread amènera-t-elle l'utilisateur final à obtenir des données incorrectes ? Exemple de code :
ExecutorService executor = Executors.newFixedThreadPool(2);

  ServiceExecutor executor0 = new ServiceExecutor("0");
  ServiceExecutor executor1 = new ServiceExecutor("100");

  Future result0 = executor.submit(executor0);
  Future result1 = executor.submit(executor1);
   
  List<String> s1 = new ArrayList<>();
  s1.add(result0.get());
  s2.add(result1.get());
Copier après la connexion

Solution de contournement

La réponse à cette question dépend en grande partie de la façon dont votre application est configurée pour recevoir les demandes de vos clients. Un nouveau service d'exécution est-il créé pour chaque requête entrante, ou le service d'exécution est-il partagé entre toutes les requêtes ? Créer un nouveau service d'exécution pour chaque requête serait très inutile car vous devrez allouer de l'espace pour un nouveau thread qui ne durera pas très longtemps. Par conséquent, il est plus efficace de réutiliser le même ExecutorService pour plusieurs requêtes.

Dans ce cas, l'utilisation de Executors.newCachedThreadPool() 而不是 newFixedThreadPool() peut être plus flexible car cela permet à ExecutorService d'augmenter dynamiquement le nombre de threads dans le pool selon les besoins.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal