Java 19 Virtual Thread – Sollten Sie ihn verwenden?

Feb 16 2023
Dieser Blog ist Teil 1 einer zweiteiligen Serie, in der erklärt wird, was virtuelle Threads in Java 19 sind, wie virtuelle Threads die Anwendungsleistung verbessern können und schließlich ein Benchmarking mithilfe virtueller Threads durchgeführt wird. Was sind virtuelle Threads: Da ChatGPT das neue Google ist, fragen wir es nach der Definition von „Virtual Threads in Java19“ (es gab jedes Mal andere und aussagekräftige Definitionen, großes Lob an die Ersteller dieser Schönheit !!!). Virtuelle Threads sind a Art von Lightweight-Threads in Java 19.

Dieser Blog ist Teil 1 einer zweiteiligen Serie, in der erläutert wird, was virtuelle Threads in Java 19 sind , wie virtuelle Threads die Anwendungsleistung verbessern können und schließlich ein Benchmarking mithilfe virtueller Threads durchgeführt wird.

Was sind virtuelle Threads:

Da ChatGPT das neue Google ist, fragen wir es nach der Definition von „Virtual Threads in Java19“ (es gab jedes Mal andere und aussagekräftige Definitionen, großes Lob an die Schöpfer dieser Schönheit!!!)

Virtuelle Threads sind eine Art leichter Threads in Java 19. Virtuelle Threads ermöglichen es Benutzern, eine große Anzahl von Threads zu erstellen, ohne den mit herkömmlichen Threads verbundenen Mehraufwand zu verursachen. Virtuelle Threads werden von der Java Virtual Machine verwaltet, sodass sie bei Bedarf wiederverwendet werden können und im Vergleich zur Verwendung herkömmlicher nativer Threads erhebliche Leistungsverbesserungen ermöglichen.

Für GoLang- Liebhaber da draußen sind virtuelle Threads zur Go-Routine nichts anderes als „ Bruder von einer anderen Mutter“.

Warum virtuelle Threads nützlich sind

Virtuelle Java-Threads unterscheiden sich von den ursprünglichen Plattform-Threads in dem Sinne, dass virtuelle Threads im Hinblick auf die Menge an Ressourcen (RAM), die sie für die Ausführung vom System benötigen, wesentlich leichter sind . Somit können in Ihren Anwendungen weitaus mehr virtuelle Threads als Plattform-Threads ausgeführt werden. Dabei profitieren Sie von allen Vorteilen eines normalen Plattform-Threads.

Verwendung virtueller Threads

Das Erstellen eines virtuellen Threads in Java ähnelt dem Erstellen eines herkömmlichen Runnable-Threads. Wir werden jedoch die Executors-Klasse verwenden, um newVirtualThreadPerTaskExecutor () zu erstellen, das für jede Aufgabe einen neuen virtuellen Thread startet. Die Anzahl der vom Executor erstellten Threads ist unbegrenzt.

Prüfen

In diesem Test rufe ich einen externen Dienst auf (der 1 Millisekunde braucht, um zu antworten) und führe den Vorgang 1 Million Mal aus, wobei ich sowohl herkömmliche Plattform- als auch virtuelle Threads verwende.

Ziel:
Vergleich der Zeit, die virtuelle Threads mit denen herkömmlicher Threads benötigen, um den Vorgang 1 Million Mal abzuschließen.
Maschinenspezifikationen: 10 Kerne, 16 GB Speicher.

Code:

Konventionelle Threads

Ich konnte nur noch maximal 1000 Threads verwenden und bekam einen OOM-Fehler.

Virtuelle Threads

Ergebnisse :

Nachfolgend finden Sie die CPU-Auslastung + die Zeit, die beide Ansätze für die zehnmalige Ausführung der externen for-Schleife benötigen.

Konventionelle Threads

Zoomen Sie, um zu sehen

Virtuelle Threads

Zoomen Sie, um zu sehen

Abschluss :

Der Zeitunterschied zwischen der Verwendung herkömmlicher und virtueller Threads gibt uns einen klaren Gewinner für die Verwendung virtueller Threads, falls wir auf einen externen Service warten. Wenn wir dieses Beispiel auf 10 Millionen oder 100 Millionen Aufrufe extrapolieren, wird der Unterschied deutlich größer und virtuelle Threads erweisen sich als leistungsstärker, wenn eine Anwendung auf eine externe Anwendung wartet.

Das Beispiel ahmte den Aufruf eines externen Dienstes mithilfe von Thread.sleep() nach, der durch einen tatsächlichen Aufruf eines externen Dienstes ersetzt werden kann. Dies wird dem Leser als Übung überlassen. TU ES!!!

HINWEIS: Es ist wahr, dass wir durch Versuch und Irrtum die Anzahl der Erstellung herkömmlicher Threads optimieren können, obwohl es nicht möglich sein wird, die perfekte Anzahl von Threads für jeden Anwendungsfall vorherzusagen (wenn Sie zufällig einen Pool mit höheren Threads behalten). , verschwenden Sie unnötig Anwendungsressourcen). Die Verwendung einer dynamischen Zuordnung von Threads (virtuellen Threads) ist in einer realen Anwendung viel sinnvoller.

Probleme bei der Verwendung virtueller Threads

Das obige Beispiel hat Ihnen gerade klar gemacht, dass virtuelle Threads angesagt sind. Um Ihre Anwendungen zu beschleunigen und Ihre CPU optimal auszulasten, sollten wir immer virtuelle Threads erstellen.

Wenn nur nicht alles mit einem „ ABER “ versehen wäre.

Virtuelle Threads in Java sind großartig, aber wenn Ihre Anwendung nicht an E/A gebunden ist, d. h. wenn die CPU selbst eine schwere Verarbeitung durchführen muss (z. B. ein Modell trainieren oder bis 100 Millionen zählen), ist die Verwendung virtueller Threads nicht die ideale Wahl.

Die Einzelheiten hierzu werden im 2. Teil dieses Artikels erläutert. Bleiben Sie dran!!!

Abschließende Gedanken

Die Einführung von Java 19 in Systemen befindet sich noch in der Entwicklungsphase (da sich das Projekt Loom derzeit nur in der Vorschauphase befindet), obwohl wir enorme Verbesserungen bei der Serververwaltung, schnellere API-Reaktionszeiten und seltenere OOM-Probleme erwarten.

Über den Autor :

Yash Bansal ist Associate Principal Engineer bei RedBus. Weitere Informationen über ihn finden Sie auf seinem LinkedIn- Profil.