web-dev-qa-db-fra.com

Comment les threads sont-ils alloués pour gérer la demande de servlet?

Quelqu'un peut-il expliquer ce qu'est un thread par demande et un thread par connexion? Sur quel modèle fonctionnent les servlets? Comment les threads sont-ils alloués pour gérer les requêtes HTTP? Est-ce un fil/demande ou une connexion?

Et disons que si je veux effectuer une tâche chronophage dans la méthode doGet() de ma Servlet de manière asynchrone, je démarre un nouveau thread en utilisant Java exécuteurs de sorte que les calculs sont effectués dans un thread séparé et la réponse est envoyée immédiatement.

Maintenant, cela garantit-il que j'ai libéré le thread qui avait traité mon HttpServletRequest ou est-il toujours utilisé car un thread enfant est toujours en cours d'exécution?

50
hellojava

Par demande, lorsqu'une demande HTTP est effectuée, un thread est créé ou récupéré à partir d'un pool pour la servir. Un thread sert toute la demande. Le thread par connexion serait la même chose sauf que le thread est utilisé pour une connexion entière, ce qui pourrait être plusieurs requêtes et pourrait également avoir beaucoup de temps mort entre les requêtes. Les conteneurs de servlets sont des threads par demande. Il peut y avoir des implémentations qui offrent du fil par connexion, mais je ne sais pas, et il semble que ce serait très inutile.

La création d'un thread à l'intérieur d'un autre thread n'établit aucune relation spéciale, et le but de le faire dans la plupart des cas est de laisser le thread continuer de fonctionner ou de se terminer pendant que l'autre thread continue de fonctionner. Dans votre scénario, l'utilisation d'un thread différent pour effectuer le travail requis par une demande permettra, comme vous vous y attendez, d'envoyer la réponse immédiatement. Le thread utilisé pour répondre à cette demande sera également immédiatement disponible pour une autre demande, quel que soit le temps nécessaire pour terminer votre autre thread. C'est à peu près la façon d'effectuer un travail asynchrone dans un conteneur de servlet thread-per-request.

Avertissement: Si vous êtes dans un conteneur complet Java EE, les threads peuvent être gérés pour vous d'une manière qui en fait une mauvaise idée de générer le vôtre. dans ce cas, il vaut mieux demander au conteneur un fil, mais les principes généraux sont les mêmes.

56
Ryan Stewart