JavaRush /Blog Java /Random-PL /Wielowątkowość w Javie

Wielowątkowość w Javie

Opublikowano w grupie Random-PL

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.
Wielowątkowość w Javie – 1
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 .
Wielowątkowość w Javie – 2
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.
Wielowątkowość w Javie – 3
Lub według innej zasady: skoro w niższej grupie jest więcej osób, zamienimy dwie dziewczynki na jednego chłopca.
Wielowątkowość w Javie – 4
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 Streami 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ę maini 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 daemonprocesy 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, Threadw 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    {// Наша очередь из сотрудников, наследник класса Thread
    private String[] names;

    PeopleQueue(String... names) {// Конструктор, аргумент- массив имен сотрудников
        this.names = names;
    }

    @Override
    public void run() { // Этот метод будет вызван при старте потока
        for (int i = 0; i < names.length; i++) { // Вывод в цикле с паузой 0.5 сек очередного сотрудника
            System.out.println("Обработаны dokumentы: " + names[i]);
            try {
                sleep(500); // Задержка в 0.5 сек
            } 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 queue1z queue2kolei 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.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION