Hi,
beginne diesen Thread, um zu versuchen ein bischen Klarheit in dieses Thema zu bringen. Deshalb sind wir hier.
Notes-Agenten starten
keinen extra Thread. Kelleher 98 hat ein kurioses Beispiel mit einem awt-Programm in einem Agenten. Da läuft die awt-Gui in einem eigenen Thread. Das ist aber nicht der Normalfall.
Sobald man von einem Java-Programm ausserhalb von Notes auf Domino Objekte zugreift, dann liegt man die Notes-Kommunikation immer in einen eigenen Thread. Warum das so genau ist, weiss ich jetzt auch nicht so genau. Ich hab das mal irgendwo gelesen. Sicher. Nach schnellem überfliegen tendiere ich dazu, dass Rose Kelleher in ihrem Klassiker "Advanced Domino 5 Programming" aus dem Jahr 98, keine Antworten bzgl. des warums liefert. Werd mal woanders nachgucken.
Bei Servlets wiederum ist es folgendermassen:
Das Servlet läuft immer innerhalb der Laufzeitumgebung Webcontainer (auch Servletengine bezeichnet).
Der Browser des Users sendet Requests grundsätzlich immer an den Webcontainer.
Der Webcontainer leitet die Requests an die Servlets weiter.
Ausserdem managed der Webcontainer die Servlets. Für einen neuen http-post (oder http-get) Request ruft der Container die entsprechende doGet oder doPost-Methode des Servlets in einem neuen Thread auf.
Der Servlet-Entwickler braucht sich dann gar nicht mehr um Thread-Handling zu kümmern. Das macht der Webcontainer nach bestimmten Regeln, die in verschiedenen Spezifikationen festgelegt sind. Implementierung dieser Funktionalität ist Sache des Web-Container Anbieters (Tomcat, Websphere, Weblogic, etc).
Der Entwickler kann sich ein Servlet immer als einzelnes Objekt vorstellen, das alle Requests verarbeitet. Ob es nicht wirklich vielleicht im Webcontainer mehrere Instanzen von einer Servlet-Klasse auf User-Anfragen warten, ist per Spezifikation nicht gesagt. Ich glaube viele Container-Hersteller arbeiten mit Servlet-Pools. Sicher ist für den Entwickler, dass es für jeden Request eben nicht 1 Servlet-Instanz gibt sondern sich mehrere Requests 1 Servlet-Instanz teilen.
Aus diesem Grund gelten Instanzvariablen nicht als Thread-Safe und solten nicht aus den doGet() und doPost() beschrieben werden (lesen ist o.k.). Das würde Chaos verursachen, da ja dann immer mehrere Threads auf 1 Instanzvariable schreiben.
Wenn man das an code ausprobiert wird das ganz offensichtlich.
Übrigens können Servlets auch das Interface SingleThreadModule implementieren. Dann ist per Spezifikation sichergestellt, dass pro einkommenden Request ein neues Servlet erzeugt wird. In der Praxis ist das aber performance-mässig katastrophal, dass es nicht verwendet wird.
Die Tatsache, das die Servlet-Instanz speicherresident (so heisst das glaub ich) vorliegt, bringt performance-Vorteile.
Ausserdem gibt es bestimmte LifeCycle callbacks Methoden, die man benutzen kann. Bevor das Servlet auf über den Web-Container einkommende http-Requests wartet, ruft der Webcontainer genau 1 Mal die init() Methode auf. Hier können Instanzvariablen initialisiert werden, die dann später von den doGet() und doPost() Aufrufen gelesen werden können. Z.B. Datenbankverbindungen, oder moderner ConnectionPools (egal was Renegaten wie Till_21 auch immer behaupten mögen
).
Bevor das Servlet aus dem Webcontainer entfernt wird, ruft der Webcontainer genau 1 mal die destroy-Methode auf. Hier können dann Datenbankverbindungen geschlossen werden oder Pools geleert.
Also um Threads braucht (und soll) man sich gar nicht kümmern. Das regelt der Container. Dieses "automatische" Multithreading muss man aber als Entwickler kennen. Es hat nämlich Auswirkungen auf die Entwicklung. Explizit hier z.B. das man keine Instanzvariablen beschreiben kann.
auf fehler bitte aufmerksam machen
gibt keine dummen Fragen
Axel