0Pricing
Java Academy · Lekcja

Model współbieżności strukturalnej

Traktowanie powiązanych zadań jako jednej całości

Model współbieżności strukturalnej to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.

Czym jest uporządkowana współbieżność

Uporządkowana współbieżność (JEP 453, funkcja w wersji testowej) traktuje grupę powiązanych współbieżnych zadań jako jedną jednostkę pracy.

Jeśli zadanie nadrzędne dzieli się na zadania podrzędne, wszystkie te zadania muszą zostać ukończone, zanim zadanie nadrzędne przejdzie dalej — podobnie jak w przypadku zakresu bloku w zwykłym kodzie.

Rozwiązywany problem

W przypadku zwykłych executorów utworzone zadanie może działać dłużej niż jego twórca, wyciec lub zostać zapomniane. Błędy w jednej gałęzi mogą pozostać niezauważone, podczas gdy pozostałe zadania nadal działają.

Prowadzi to do wycieków wątków, osieroconej pracy i trudnej do zrozumienia obsługi błędów.

Zadania jako drzewo

Uporządkowana współbieżność wymusza relację nadrzędny–podrzędny. Zadania podrzędne tworzą drzewo, którego korzeniem jest zadanie, które je uruchomiło.

  • Zadanie podrzędne nie może działać dłużej niż zakres zadania nadrzędnego
  • Zadanie nadrzędne czeka na ukończenie wszystkich zadań podrzędnych
  • Anulowanie przepływa w dół drzewa

Odwzorowanie kodu sekwencyjnego

Najważniejsza idea polega na tym, że kod współbieżny powinien wyglądać jak kod sekwencyjny. Zakres zostaje otwarty, praca jest rozdzielana, a zakres zamyka się dopiero po zakończeniu wszystkich zadań i ich połączeniu.

Dzięki temu czas życia zadań jest oczywisty, a rozumowanie o błędach staje się łatwiejsze.

Dawne podejście nieuporządkowane

Oto znane, ale nieuporządkowane podejście z użyciem zwykłego executora. Działa ono, ale nic nie gwarantuje, że czas życia obu obiektów Future będzie skoordynowany.

import java.util.concurrent.*;

public class Main {
    public static void main(String[] args) throws Exception {
        try (ExecutorService exec = Executors.newVirtualThreadPerTaskExecutor()) {
            Future<String> user = exec.submit(() -> "Ada");
            Future<Integer> order = exec.submit(() -> 7);
            System.out.println(user.get() + " has " + order.get() + " orders");
        }
    }
}

Dlaczego koordynacja ma znaczenie

W poprzednim przykładzie, jeśli pobranie użytkownika się nie powiedzie, zadanie pobierające zamówienie nadal działa bezużytecznie. Trzeba je ręcznie anulować i obsłużyć wyjątki z każdego wywołania get().

Uporządkowana współbieżność automatyzuje tę koordynację.

Status wersji testowej

Uporządkowana współbieżność jest dostępna jako interfejs API w wersji testowej w pakiecie java.util.concurrent. Aby z niej korzystać, należy kompilować i uruchamiać program z opcją --enable-preview.

Centralną klasą jest StructuredTaskScope, którą omówimy w następnej lekcji.

Gwarancje cyklu życia

W obrębie strukturalnego zakresu:

  • Wszystkie podzadania zostają ukończone albo kończą się niepowodzeniem lub anulowaniem przed zakończeniem zakresu
  • Żadne podzadanie nie wymyka się do wykonywania w tle
  • Stos wywołań odzwierciedla rzeczywistą hierarchię zadań w zrzutach wątków

Korzyść w zakresie obserwowalności

Ponieważ drzewo podzadań jest jawne, narzędzia JDK mogą je wyświetlić. Zrzut wątków grupuje podzadania pod ich nadrzędnym zakresem, dzięki czemu diagnozowanie jest znacznie łatwiejsze niż w przypadku rozproszonych wątków puli.

Dobra współpraca z wątkami wirtualnymi

Każde podzadanie w strukturalnym zakresie działa domyślnie na własnym wątku wirtualnym. Niski koszt wątków wirtualnych sprawia, że rozdzielanie pracy na wiele podzadań jest praktyczne.

Obie funkcje zaprojektowano tak, aby współdziałały ze sobą.

Model mentalny

Zakres strukturalny można traktować jak blok try-with-resources dla współbieżności: zakres jest otwierany, praca rozdzielana za pomocą fork, następuje join, a potem zamknięcie. Nawias zamykający gwarantuje, że nic nie pozostanie uruchomione.

Szybkie sprawdzenie

Proszę sprawdzić zrozumienie podstawowej zasady.

Podsumowanie

Poznali Państwo model współbieżności strukturalnej:

  • Powiązane zadania tworzą drzewo związane z cyklem życia zakresu
  • Kod współbieżny czyta się jak kod sekwencyjny
  • Jest to API w wersji preview wymagające --enable-preview
  • Naturalnie współpracuje z wątkami wirtualnymi

Następnie: samo API StructuredTaskScope.

Często zadawane pytania

Czy lekcja „Model współbieżności strukturalnej” jest bezpłatna?

Tak — pełny tekst „Model współbieżności strukturalnej” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Model współbieżności strukturalnej”?

Traktowanie powiązanych zadań jako jednej całości Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Java Academy?

Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Model współbieżności strukturalnej”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?

Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Model współbieżności strukturalnej
  2. StructuredTaskScope
  3. Zamykanie po błędzie i powodzeniu
  4. Obsługa błędów i anulowanie
← Powrót do Java Academy