Wstęp
Zanim poznamy wątki Java, spójrzmy w najbliższą przyszłość. Wyobraź sobie, że złożyłeś CV i odbyłeś rozmowę kwalifikacyjną. Ty i kilkudziesięciu przyszłych współpracowników zostaliście zaproszeni do pracy w dużej firmie programistycznej. Między innymi musisz dostarczyć papierowe dokumenty do zatrudnienia zmęczonemu pracownikowi HR.
Aby przyspieszyć proces, kandydatów na stanowisko można podzielić na dwie grupy i rozdzielić pomiędzy dwóch menedżerów HR (o ile tacy są w firmie). Dzięki temu przyspieszamy proces dzięki równoległym pracom
projektowym .
Jeśli w firmie jest tylko jeden oficer personalny, będziesz musiał jakoś się wydostać. Na przykład możesz ponownie podzielić wszystkich na dwie grupy, na przykład przeprowadzić wywiady po kolei z dziewczynami i chłopcami.
Lub według innej zasady: skoro w niższej grupie jest więcej osób, zamienimy dwie dziewczynki na jednego chłopca.
Taki sposób organizacji pracy nazywa się
wielowątkowym . Nasz zmęczony HRowiec przełącza się do różnych grup, aby zrekrutować z nich kolejnego pracownika. Jest może jedenaście grup i czterech oficerów personalnych. W takim przypadku
przetwarzanie wielowątkowe będzie odbywać się równolegle przez kilka działów kadr, którzy mogą przyjąć kolejną osobę z dowolnej grupy do przetwarzania jej dokumentów.
Procesy
Procesem (
procesem ) w tym przypadku będzie organizacja pracy odbioru dokumentów. W organizacji można wyróżnić kilka procesów: księgowość, tworzenie oprogramowania, spotkania z klientami, operacje magazynowe itp. Do każdego procesu przydzielane są zasoby: pomieszczenia, pracownicy do jego realizacji. Procesy są od siebie odizolowane: pracownicy HR nie mają dostępu do bazy księgowej, a kierownicy obsługi klienta nie biegają po magazynie. Jeśli proces potrzebuje dostępu do cudzych zasobów, konieczne jest nawiązanie komunikacji między procesami: notatki, wspólne spotkania.
Strumienie
Praca w procesie jest zorganizowana w wątki (
java thread
). Dla działu HR przepływ oznacza organizację pracy w celu obsługi grupy. Na pierwszym zdjęciu jest jeden przepływ, na kolejnych trzech są dwa. W ramach procesu wątki mogą być realizowane równolegle – dwóch HR-owców przyjmuje dwie lub więcej grup przyszłych pracowników. Interakcja personelu z grupami – przetwarzanie wątków w procesie – nazywana jest
synchronizacją wątków . Rysunki projektu dwóch grup przez jednego oficera personalnego pokazują metody: jednolite (dziewczynka - chłopiec - dziewczynka - chłopiec) i z różnymi priorytetami (dwie dziewczyny na przemian z jednym chłopcem). Wątki mają dostęp do zasobów procesu, do którego należą: grupy do pracownika HR otrzymują próbki formularzy aplikacyjnych, długopisy do wypełniania dokumentów. Jeśli jednak przepływy wchodzą w interakcję z rzeczami dla nich wspólnymi, możliwe są zdarzenia. Jeśli oficer personalny poprosi Cię o wykrzyczenie imienia ostatniej osoby w kolejce, to w przypadku dwóch grup nie jest z góry pewien, czy usłyszy imię kobiety, czy mężczyzny. Takie konflikty dostępu do danych, blokowanie i sposoby ich rozwiązywania to bardzo ważny temat.
Stany przepływu
Każdy wątek znajduje się w jednym z następujących stanów:
- Utworzono (
New
) – szykuje się kolejka do HR, ludzie się organizują.
- Uruchomiona (
Runnable
) – nasza kolejka ustawiła się w kolejce do pracownika HR i jest przetwarzana.
- Zablokowany (
Blocked
) – ostatni młody mężczyzna w kolejce próbuje wykrzyczeć jakieś imię, ale gdy usłyszał, że dziewczyna z następnej grupy zaczęła to robić przed nim, umilkł.
- Zakończona (
Terminated
) - cała kolejka została uzupełniona przez pracownika HR i nie ma takiej potrzeby.
- Oczekiwanie(
Waiting
) – jedna kolejka oczekuje na sygnał od drugiej.
Organizacja wątków i ich wzajemne oddziaływanie jest podstawą efektywnego działania procesów.
Wróćmy do świata IT
W XXI wieku istotne stało się wykonywanie wielowątkowe i równoległe. Od lat 90-tych ubiegłego wieku wielozadaniowe systemy operacyjne Windows, MacOS i Linux zadomowiły się na komputerach domowych. Często można w nich znaleźć cztery lub więcej procesorów rdzeniowych. Liczba równoległych bloków kart graficznych GPU przekroczyła już tysiąc. Popularne programy pisane są z uwzględnieniem wielowątkowości (wielowątkowość), np. nowoczesne wersje oprogramowania do obróbki grafiki, wideo, czy pracy z dużą ilością danych: Adobe Photoshop, WinRar, Mathematica, nowoczesne gry. Wielowątkowość Java to bardzo ważny, popularny i złożony temat. Dlatego w kursie JavaRush znajduje się wiele zadań pozwalających go bardzo dobrze zrozumieć. Przykłady Java dotyczące wielowątkowości pomogą Ci opanować podstawowe niuanse i subtelności tego obszaru, synchronizując pracę wątków.
Proces
Proces to działająca instancja programu, któremu system operacyjny (OS) przydzielił pamięć, czas/rdzenie procesora i inne zasoby. Ważne jest, aby pamięć była przydzielana osobno, przestrzenie adresowe różnych procesów nie są dla siebie dostępne. Jeśli procesy muszą się komunikować, mogą to zrobić za pomocą plików, potoków i innych metod komunikacji między procesami.
Przepływ
Java
Thread
(strumień). Czasami, aby uniknąć pomyłek z innymi klasami Java
Stream
i tym podobnymi, wątki Java są często tłumaczone jako wątki. Wykorzystują zasoby przydzielone procesowi i stanowią sposób, w jaki proces jest wykonywany. Główny wątek wykonuje metodę
main
i kończy działanie. Kiedy proces jest wykonywany, mogą zostać utworzone dodatkowe wątki (wątki podrzędne). Wątki tego samego procesu mogą wymieniać między sobą dane. Wielowątkowość Java wymaga uwzględnienia synchronizacji danych, nie zapominaj o tym. W Javie proces kończy się w momencie zakończenia jego ostatniego wątku. W przypadku zadań w tle wątek można uruchomić jako demon (
daemon
), różnica w stosunku do zwykłego wątku polega na tym, że zostanie on wymuszony zakończony, gdy wszystkie
daemon
procesy niebędące wątkami zakończą się.
Pierwsza aplikacja wielowątkowa
Sposobów tworzenia wątków jest ponad pół tuzina; w kursie JavaRush przyjrzymy się im szczegółowo. Najpierw zapoznajmy się z jednym z podstawowych. Istnieje specjalna klasa,
Thread
w metodzie
run()
której należy napisać kod implementujący logikę programu. Po utworzeniu wątku możesz go uruchomić wywołując metodę
start()
. Napiszmy program demonstracyjny, który implementuje przykładową wielowątkowość Java.
class PeopleQueue extends Thread {
private String[] names;
PeopleQueue(String... names) {
this.names = names;
}
@Override
public void run() {
for (int i = 0; i < names.length; i++) {
System.out.println("Обработаны dokumentы: " + names[i]);
try {
sleep(500);
} catch (Exception e) {}
}
}
}
public class HR {
public static void main(String[] args) {
PeopleQueue queue1 = new PeopleQueue("Iwan","Сергей","Николай","Фердинанд","Bazylia");
PeopleQueue queue2 = new PeopleQueue("Мария","Людмила","Алиса","Карина",„Olga”);
System.out.println("Начали!");
queue1.start();
queue2.start();
}
}
Uruchommy program. Konsola wyświetla komunikat wyjściowy z głównego wątku. Następnie każdy wątek podrzędny
queue1
z
queue2
kolei wysyła do wspólnej konsoli komunikaty dotyczące następnego przetworzonego pracownika. Jedna z możliwych opcji programu:
Начали!
Обработаны dokumentы: Мария
Обработаны dokumentы: Iwan
Обработаны dokumentы: Людмила
Обработаны dokumentы: Сергей
Обработаны dokumentы: Алиса
Обработаны dokumentы: Николай
Обработаны dokumentы: Карина
Обработаны dokumentы: Фердинанд
Обработаны dokumentы: Ольга
Обработаны dokumentы: ВасLubй
Process finished with exit code 0
Wielowątkowość w Javie to temat złożony i wieloaspektowy. Umiejętność pisania kodu z wykorzystaniem obliczeń równoległych, wielozadaniowych i wielowątkowych pomoże Ci efektywnie realizować zadania na nowoczesnych procesorach wielordzeniowych i klastrach składających się z wielu komputerów.
GO TO FULL VERSION