Der Grund, warum Multithreading trotz der Herausforderungen immer noch verwendet wird, liegt darin, dass Multithreading immer noch mehrere Vorteile hat, einige dieser Vorteile sind:
Bessere Ressourcennutzung
Einfache Programmierung in einigen Szenarien
Schnelleres Reaktionsprogramm
Bessere Ressourcennutzung
Stellen Sie sich eine Anwendung vor, die Dateien aus dem lokalen Dateisystem liest und verarbeitet. Nehmen wir an, das Lesen einer Datei von der Festplatte dauert 5 Sekunden, die Verarbeitung dauert 2 Sekunden, die Ausführung beider Dateien dauert: Beim Lesen einer Datei von der Festplatte wird die meiste CPU-Zeit damit verbracht, darauf zu warten, dass die Datei gelesen wird. Zu diesem Zeitpunkt ist die CPU ziemlich im Leerlauf. Es kann einige andere Dinge tun. Durch Ändern der Reihenfolge dieses Vorgangs kann die CPU besser ausgelastet werden. Schauen Sie sich diese Reihenfolge an:
5 seconds reading file A 2 seconds processing file A 5 seconds reading file B 2 seconds processing file B ----------------------- 14 seconds total
CPU wartet darauf, dass die erste Datei gelesen wird. Dann beginnt es mit dem Lesen der zweiten Datei. Während die zweite Datei gelesen wird, führt diese CPU die erste Datei aus. Denken Sie daran, dass diese CPU die meiste Zeit im Leerlauf ist, während sie darauf wartet, dass Dateien von der Festplatte gelesen werden.
5 seconds reading file A 5 seconds reading file B + 2 seconds processing file A 2 seconds processing file B ----------------------- 12 seconds totalNormalerweise kann die CPU einige andere Dinge tun, während sie auf IO wartet. Es muss nicht unbedingt Disk-IO sein. Es könnte sich auch um Netzwerk-E/A oder eine Eingabe eines Benutzers handeln. Netzwerk- und Festplatten-IO sind viel langsamer als CPU- und Speicher-IO.
Einfachere Programmierung
Wenn Sie die obige Sequenz zum manuellen Lesen und Verarbeiten von Dateien in einer Single-Thread-Anwendung schreiben, müssen Sie dies tun Verfolgen Sie den Status jeder gelesenen und verarbeiteten Datei. Stattdessen können Sie zwei Threads starten, von denen jeder einfach eine separate Datei liest und verarbeitet. Jeder dieser Threads wird blockiert, während er darauf wartet, dass die Festplatte die Datei liest. Während des Wartens können andere Threads die CPU nutzen, um Teile der Datei zu verarbeiten, die sie bereits gelesen haben. Das Ergebnis ist, dass die Festplatte ständig damit beschäftigt ist, verschiedene Dateien in den Speicher zu lesen. Das Ergebnis ist eine bessere Festplatten- und CPU-Auslastung. Außerdem ist die Programmierung einfacher, da ein Thread nur eine einzelne Datei verfolgt. Schneller reagierende Programme
Ein weiteres gemeinsames Ziel ist die Umwandlung einer Single-Threaded-Anwendung in eine Multithread-Anwendung. Eine reaktionsfähigere App. Stellen Sie sich eine Serveranwendung vor, die einige Ports auf eingehende Anfragen überwacht. Wenn eine Anfrage empfangen wird, verarbeitet es die Anfrage und kehrt dann zum Abhören zurück. Dieser Serverzyklus lässt sich wie folgt zusammenfassen:
Wenn die Verarbeitung dieser Anfrage lange dauert, senden in dieser Zeit keine neuen Clients Anfragen an den Server. Nur der Server kann auf eingehende Anfragen warten.
while(server is active){ listen for request process request }Ein alternatives Design besteht darin, dass der Überwachungsthread eine Anfrage an einen Arbeitsthread weiterleitet und sofort zum Überwachungsthread zurückkehrt. Dieser Worker-Thread führt die Anfrage aus und sendet eine Antwort an den Client. Das Design ist wie folgt beschrieben:
Auf diese Weise kehrt der Server-Thread schnell zu zurück Abhörgerät. So können mehr Clients Anfragen an den Server senden. Der Server ist reaktionsschneller geworden.
while(server is active){ listen for request hand request to worker thread }Das Gleiche gilt für Desktop-Anwendungen. Wenn Sie auf eine Schaltfläche klicken, um eine Aufgabe mit langer Laufzeit zu starten, und der Thread, der die Aufgabe ausführt, der Thread ist, der Fenster, Schaltflächen usw. aktualisiert, reagiert die Anwendung bei der Ausführung der Aufgabe nicht mehr. Stattdessen kann diese Aufgabe in einen Arbeitsthread umgewandelt werden. Während der Arbeitsthread mit der Verarbeitung von Aufgaben beschäftigt ist, kann der Fensterthread frei sein, um auf andere Benutzeranfragen zu reagieren. Wenn der Arbeitsthread abgeschlossen ist, wird dies dem Fensterthread signalisiert. Der Fensterthread kann dann das Anwendungsfenster basierend auf den Ergebnissen dieser Aufgabe aktualisieren. Programme, die mit Worker-Threads entwickelt wurden, ermöglichen Benutzern schnellere Antworten.
Das Obige ist der Inhalt der Vorteile von Java-Multithreading. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn).