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

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

WBOY
WBOYavant
2024-02-22 12:43:06588parcourir

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());

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer