Wie unterscheidet sich Multithreading in einer Java-basierten Webanwendung von einer eigenständigen Java-Anwendung?

13

Ich bin ziemlich neu in Java und meine Erfahrung beschränkt sich auf webbasierte Anwendungen, die auf einem Webcontainer ausgeführt werden (in meinem Fall Jboss).

Stimmt es, dass der Webcontainer für Webanwendungen das Multithreading übernimmt? Wenn ja, kann ich neue Schritte in webbasierten Anwendungen einführen? Gibt es einen Vorteil dabei und in welchem ​​Szenario müsste man das tun?

kapricanon
quelle
Bis EE6 sollst du keine Threads verwenden; EE7 stellt vor Concurrency Utilities.
Setzen Sie Monica - M. Schröder am

Antworten:

20

Stimmt es, dass der Webcontainer für Webanwendungen das Multithreading übernimmt?

Die meisten Webserver (Java und andere, einschließlich JBoss) folgen einem Modell "Ein Thread pro Anfrage", dh jede HTTP-Anfrage wird vollständig von genau einem Thread verarbeitet. Dieser Thread verbringt häufig die meiste Zeit damit, auf Dinge wie DB-Anforderungen zu warten. Der Webcontainer erstellt bei Bedarf neue Threads.

Einige Server (im Java-Ökosystem in erster Linie Netty ) führen eine asynchrone Anforderungsverarbeitung durch, entweder mit einem Modell "Ein Thread erledigt alles" oder mit einem komplexeren Modell. Die Grundidee dabei ist, dass viele wartende Threads Ressourcen verschwenden, sodass asynchrones Arbeiten effizienter sein kann.

Wenn ja, kann ich neue Schritte in webbasierten Anwendungen einführen?

Dies ist möglich, sollte aber sehr sorgfältig durchgeführt werden, da Fehler (wie Speicherverluste oder fehlende Synchronisierung) zu schwer reproduzierbaren Fehlern führen oder den gesamten Server zum Stillstand bringen können.

Gibt es einen Vorteil dabei und in welchem ​​Szenario müsste man das tun?

Der Vorteil ist, dass Sie parallel arbeiten können. Mit Gewinden reine Rechengeschwindigkeit zu verbessern , ist etwas , das Sie sollen nicht auf einem Webserver tun, da sie den Umgang mit anderen Anforderungen verlangsamen würde. Dies sollte auf einem separaten Server durchgeführt werden, wahrscheinlich unter Verwendung einer Jobwarteschlange.

Ein legitimes Szenario für Multithreading im Zusammenhang mit der Verarbeitung einer HTTP-Anforderung kann sein, dass Sie auf andere Netzwerkressourcen zugreifen müssen, z. B. mehrere verschiedene Webdienste aufrufen. Wenn Sie es in einem Zug tun, müssen Sie warten, bis jeder Anruf der Reihe nach beendet ist. Wenn Sie jedoch mehrere Threads verwenden, ist die gesamte Wartezeit nur die Verzögerung des langsamsten Einzelaufrufs.

Michael Borgwardt
quelle
3
Macht Sinn. Ist die ExecutorService-Schnittstelle der beste Weg, um neue Threads in einer Webanwendung zu erstellen?
kapricanon
4
@kapricanon: Ja, es sei denn, Sie haben bestimmte Anforderungen, die nicht erfüllt werden können, oder Ihr Webserver hat bereits ähnliche Anforderungen.
Michael Borgwardt
2

Als Antwort auf Ihre Frage:

Wie unterscheidet sich Multithreading in einer Java-basierten Webanwendung von einer eigenständigen Java-Anwendung?

Das ist nicht anders. Normalerweise bieten die Software-Webanwendungen, auf denen aufgebaut ist, bereits Multithreading, indem jede neue Anforderung zu einem Thread gemacht wird. Sie können Threads wie jede andere Anwendung verwenden / erstellen.

In der Tat kann Multithreading zu drastischen Leistungssteigerungen führen, wenn Sie es richtig einsetzen. Bei E / A-intensiven Aufgaben wie Netzwerkzugriff und Festplattenzugriff ist die Leistungssteigerung fast immer garantiert. Bei rechenintensiven Aufgaben sollten Sie sich an die Regel eines Threads pro Core auf dem Server halten. Wenn Ihr Core beispielsweise über einen i7-Prozessor verfügt, sollten Sie sich an 7 Threads halten, um Rechenaufgaben zu erledigen.

Als Antwort auf Ihre Frage:

Gibt es einen Vorteil dabei und in welchem ​​Szenario müsste man das tun?

Michael Borgwart sagt, Sie sollten dies nicht tun, um die Rechengeschwindigkeit zu verbessern. Ich stimme dem nicht zu, da in diesem Artikel vorgeschlagen wird, dass Multithreading die Reaktionsfähigkeit verbessern kann, wenn Benutzer eine rechenintensive Aufgabe ausführen müssen. Im Klartext müssen Benutzer nicht so lange warten, um rechenintensive Aufgaben mit Multithreading zu erledigen.

Wenn Sie Threads häufig verwenden möchten, empfehle ich die Verwendung eines Thread-Pools. Dies reduziert den Aufwand beim Erstellen von Threads.

SyntaxRules
quelle
Wie beantwortet dies die gestellte Frage?
gnat
1
Die Antworten sollten für sich allein stehen. Wenn Sie einen Kommentar abgeben möchten, müssen Sie zuerst 50 Rufpunkte sammeln.
ChrisF
1

Nun, das ist eine schöne Frage, und ich denke, die meisten Entwickler, die in der Entwicklung von Webanwendungen arbeiten, verwenden Multithreading nicht explizit. Der Grund liegt auf der Hand, da Sie einen Anwendungsserver zum Bereitstellen Ihrer Anwendung verwenden. Der Anwendungsserver verwaltet intern einen Thread-Pool für eingehende Anforderungen.

Warum dann explizit Multithreading verwenden? Was braucht ein Webanwendungsentwickler, um sich dem Multithreading auszusetzen?

Wenn Sie in einer Großanwendung arbeiten, in der Sie viele Anforderungen gleichzeitig bearbeiten müssen, ist es schwierig, alle Arten von Anforderungen synchron zu verarbeiten, da bestimmte Arten von Anforderungen möglicherweise viel verarbeitet wurden, was die Leistung Ihrer Anwendung beeinträchtigen könnte.

Nehmen wir ein Beispiel, in dem eine Webanwendung nach der Bearbeitung einer bestimmten Art von Anforderung Benutzer per E-Mail und SMS benachrichtigen muss. Wenn Sie dies synchron mit dem Anforderungsthread tun, kann dies die Leistung Ihrer Webanwendung beeinträchtigen. Hier kommt also die Rolle des Multithreading. In solchen Fällen ist es ratsam, eine eigenständige Multithread-Anwendung über das Netzwerk zu entwickeln, die nur für das Senden von E-Mails und SMS zuständig ist.

Anurag Sharma
quelle
Warum wird diese Antwort abgelehnt?
Anurag Sharma