← Notizen

Java 21: Virtuelle Threads, sequenzierte Collections und Preview-Grenzen

Virtuelle Threads, sequenzierte Collections, Record Patterns und Pattern Matching für switch sind finale Funktionen in JDK 21 und funktionieren ohne Preview-Flags. String Templates waren in dieser Version noch eine Preview-Funktion; ein JDK-Upgrade verleiht nicht jeder neuen Funktion denselben Stabilitätsstatus. Die JDK-21-Release-Notes unterscheiden finale, Preview- und Incubator-Funktionen.

Java 21 wurde am 19. September 2023 allgemein verfügbar. Dieser Artikel betrachtet den Release anhand eines reproduzierbaren Beispiels. Er empfiehlt weder das neueste JDK noch eine Patch-Version für den Produktivbetrieb.

Ablauf

Der Ablauf folgt Jdk21Example ohne Preview-Flags. Die umgekehrte Liste ist eine Sicht; join wartet auf die Ausgabe des virtuellen Threads.

Der Ablauf folgt Jdk21Example ohne Preview-Flags. Die umgekehrte Liste ist eine Sicht; join wartet auf die Ausgabe des virtuellen Threads.

Funktionsstatus in JDK 21

Funktion Status in JDK 21 Was zu prüfen ist
Virtuelle Threads Final Für viele I/O-lastige Aufgaben erwägen; sie garantieren keine schnellere CPU-Berechnung
Sequenzierte Collections Final Einheitliche APIs für erste/letzte Elemente und umgekehrte Sichten
Record Patterns und Pattern Matching für switch Final Werte zerlegen und nach Mustern verzweigen
String Templates Preview Nicht davon ausgehen, dass spätere JDKs sie beibehalten
Strukturierte Nebenläufigkeit Preview Getrennt von der Finalisierung virtueller Threads beurteilen
Vector API Sechster Incubator Inkubierende APIs von finalen und Preview-Funktionen unterscheiden

Dies ist eine Auswahl. Die JDK-21-Release-Notes dokumentieren auch Preview- und Incubator-Status. Den Status von Sprachfunktionen finden Sie in den Java-21-Sprachänderungen. String Templates waren in JDK 23 nicht enthalten; siehe Historie und Standardalternativen.

Ohne Preview-Flags kompilieren

Der folgende Code wurde lokal mit Zulu JDK 21.0.1 ausgeführt. Diese alte Patch-Version dokumentiert die Reproduktionsumgebung und ist keine Produktionsempfehlung. Prüfen Sie zuerst, ob javac und java dieselbe JDK-21-Installation verwenden.

Jdk21Example.java

import java.util.ArrayList;
import java.util.List;

public class Jdk21Example {
    record Point(int x, int y) {}

    static String describe(Object value) {
        return switch (value) {
            case null -> "missing";
            case Point(int x, int y) -> "point=" + x + "," + y;
            default -> "other";
        };
    }

    public static void main(String[] args) throws InterruptedException {
        var names = new ArrayList<>(List.of("alpha", "beta", "gamma"));
        var reverse = names.reversed();
        names.set(0, "ALPHA");
        System.out.println(names.getFirst() + "/" + names.getLast());
        System.out.println(reverse);
        System.out.println(describe(new Point(2, 3)));
        System.out.println(describe(null));
        Thread worker = Thread.ofVirtual().start(() ->
                System.out.println("virtual=" + Thread.currentThread().isVirtual()));
        worker.join();
    }
}
javac --release 21 Jdk21Example.java
java Jdk21Example
ALPHA/gamma
[gamma, beta, ALPHA]
point=2,3
missing
virtual=true

reversed() liefert eine umgekehrte Sicht statt einer unabhängigen Kopie. Ändert sich das erste Element der Originalliste, ist auch das letzte Element der umgekehrten Ausgabe ALPHA. getFirst() würde bei einer leeren Collection eine Ausnahme auslösen; dieses Beispiel verwendet eine nicht leere Liste. Die SequencedCollection-API definiert den Sichtvertrag.

Point(int x, int y) ist ein Record Pattern; case null behandelt null separat. Der virtuelle Thread gibt die letzte Zeile aus, und join() wartet auf seinen Abschluss. Dies prüft API-Verhalten, ohne Durchsatz oder Latenz zu messen. Der Leitfaden zu virtuellen Threads erläutert ihre Eignung für Nebenläufigkeit mit überwiegenden I/O-Wartezeiten.

Prüfen Sie vor einem Wechsel der Anwendungslaufzeit die JDK-21-Kompatibilität von Framework, Build-Werkzeugen und Instrumentierungsagenten. JDK-Funktionsstatus und Supportzeitraum eines Distributors sind getrennte Fragen. Temurin-21-Release-Historie und Binärauswahl zeigt, wie Sie die tatsächlich veröffentlichten Artefakte eines Distributors prüfen.

Diskussion

Auf GitHub ansehen ↗