2012-04-08 6 views

Antwort

15

In den meisten Situationen bei der Bearbeitung von Anfragen blockieren oder warten auf eine externe Ressource/Bedingung. In diesem Fall besetzen Sie den Thread (daher viel Speicher), ohne etwas zu tun.

Mit Servlet 3.0 können Sie Tausende von gleichzeitigen Verbindungen bedienen, viel mehr als verfügbare Threads. Denken Sie an eine Anwendung, die das Herunterladen von Dateien mit begrenztem Durchsatz ermöglicht. Die meiste Zeit sind Ihre Threads inaktiv, da sie darauf warten, den nächsten Datenblock zu senden. In gewöhnlichen Servlets können Sie nicht mehr Clients bedienen als die Anzahl Ihrer HTTP-Threads, obwohl diese Threads in den meisten Fällen inaktiv sind.

In Servlet 3.0 können Sie Tausende von verbundenen Clients mit wenigen HTTP-Threads haben. Sie können ein Beispiel aus der Praxis in meinem Artikel finden: Tenfold increase in server throughput with Servlet 3.0 asynchronous processing von dieser Frage inspiriert: Restrict download file bandwidth/speed in Servlet

Ist der Faden von startAsync erstellt irgendwie günstiger?

Es wurde kein Thread von startAsync erstellt! Es teilt nur den Servlet-Container mit: hey, obwohl die doGet/doPost Methode beendet, ich bin nicht mit dieser Anfrage fertig, bitte nicht schließen. Das ist der springende Punkt - Sie wahrscheinlich wird nicht neue Thread für jede async Anfrage erstellen. Hier ist ein weiteres Beispiel: Tausende von Browsern warten auf eine Kursänderung mit . In Standard-Servlets würde dies bedeuten: Tausende von Leerlauf-Threads warten auf ein Ereignis.

Mit Servlet 3.0 können Sie einfach alle asynchronen Anforderungen in einer ArrayList oder einer Warteschlange warten. Wenn die Kursänderung eintrifft, senden Sie sie nacheinander an alle Kunden. In diesem Szenario ist nicht mehr als ein Thread erforderlich - und alle HTTP-Threads können die verbleibenden Ressourcen frei verarbeiten.

+0

Vielen Dank! Das macht Sinn :) – Aivar

+0

... aber leider ist es für mich noch nicht ganz klar. Sieht so aus, als wäre ich wegen des Beispiels, aus dem ich AsyncContext gelernt habe, verwirrt. Ich habe eine andere Frage dazu geschrieben, vielleicht könntest du dir das auch anschauen: http://stackoverflow.com/questions/10073392/whats-the-purpose-of-asynccontext-start-in-servlet-3-0 – Aivar

4

Mit Servlet 3.0 können Sie einfach alle asynchronen Anforderungen in einer ArrayList oder einer bestimmten Warteschlange warten Problem ist dies. Sie benötigen weiterhin einen neuen Thread, um die Anforderung zu verarbeiten und die Anforderung abzurufen, um die Antwort endgültig zu senden. So frei wir http-Threads, aber müssen einige Thread erstellen, um die Anfrage zu bearbeiten