2011-07-31 1 views
4

Pour qu'un objet soit exécutable, il doit implémenter l'interface Runnable ou étendre la classe Thread, cependant, il ne semble pas que HttpServlet en fasse partie.HttpServlet n'implémente pas le thread exécutable ou le thread étendu, pourquoi est-il thread-able?

Comment se fait-il que HttpServlet puisse être enfilé ou est-ce que je me suis trompé?

+1

Ce n'est pas parce que quelque chose est «sans danger pour les threads» (je prends cela comme le nom de «thread-able») que cela fournit un point d'entrée pour un thread. –

+2

Connexes: http://stackoverflow.com/questions/3106452/java-servlet-instantiation-and-session-variables – BalusC

Répondre

13

La servlet elle-même n'est pas un thread. Le conteneur conserve une instance de la classe de servlet et chaque requête (thread) appelle le même objet servlet. Les instances de servlet sont donc partagées entre les threads. Dans le code pseudo il peut ressembler à ceci:

class ServerThread extends Thread { 

    private javax.servlet.Servlet servlet; 
    private javax.servlet.ServletRequest req; 
    private javax.servlet.ServletResponse res; 

    public ServerThread(javax.servlet.Servlet servlet, /* request and response */) { 
     this.servlet = servlet; 
     this.req = req; 
     this.res = res; 
    } 

    @Override 
    public void run() { 
     this.servlet.service(req, resp); 
    } 

} 

Pas question, en réalité, ce sera beaucoup, beaucoup, beaucoup plus complexe :-)

BTW: C'est la raison pour laquelle vos classes de servlet doivent être fil sûr!

+0

Merci mon pote ... –

+1

Aussi, dites-vous que le servlet est un singleton, ou est-ce que c'est ... fournisseur indépendant? –

+1

@Chris Boon: Je suis sûr que c'est un singleton, mais je ne sais pas comment les fournisseurs de conteneurs (comme Tomcat) gèrent ça ... ils ont peut-être introduit des astuces _crazy_. Mais oui, vous devriez le traiter comme un singleton. – home

1

Toute classe en Java peut être exécutée sur n'importe quel thread, à moins qu'elle ne soit explicitement interdite au moment de l'exécution par une sorte de vérification. Sans connaître les détails de HttpServlet, j'imagine que quelque part vous avez rencontré une déclaration à l'effet de HttpServlet thread-safe. Si tel est le cas, cela signifie qu'une instance donnée de la classe (ou des méthodes statiques de la classe) peut être utilisée en toute sécurité à partir d'un nombre illimité de threads à la fois.

En outre, la raison pour laquelle Thread est exécutable est qu'il implémente l'interface Runnable; n'importe quelle classe peut le faire. L'aspect notable de la méthode run() est que lorsqu'une instance Thread est démarrée, sa méthode run() est appelée sur un thread séparé.

0

Tout est threadable. Un EJB pour les haricots de printemps ne sont pas des threads eux-mêmes, mais ils fonctionnent dans des environnements multi-threads et sont donc compatibles avec les threads.

Questions connexes