Wyjaśnienie wielowątkowości w Javie [z przykładami]
Opublikowany: 2021-06-15Spis treści
Wątki w Javie
Wątki w Javie wspomagają efektywne działanie programu. Dwie podstawowe jednostki wykonania proformy to proces i wątki. Proces może być aplikacją, programem lub samodzielnym środowiskiem wykonawczym.
Podczas gdy wątki współdzielą zasób z zasobami procesu i istnieją z nim. W każdej aplikacji Java występuje co najmniej jeden wątek, zwany głównym wątkiem. Z głównego wątku można utworzyć wiele wątków. Dowiedz się więcej o tworzeniu wątku w Javie.
Zalety wątku Java
- Tworzenie wątku wymaga mniej czasu i zasobów w porównaniu z procesami. Dlatego wątki są również nazywane lekkim procesem.
- Dane i kod procesu nadrzędnego są współdzielone przez wątki.
- Komunikacja wewnętrzna między wątkami jest łatwa w porównaniu do komunikacji wewnętrznej w procesie.
- Wątki w Javie mogą być tworzone poprzez implementację java.lang. Uruchomiony interfejs.
Pojedynczy wątek
W programie występuje kilka jednostek przetwarzających, z których najmniejsza nazywana jest pojedynczym wątkiem. Poprzez użycie „klasy wątków” Java stosuje wątki. Istnieją dwa rodzaje wątków; wątek demona i wątek użytkownika.
Gdy aplikacja ma zostać wyczyszczona, następuje użycie wątku demona. Działa w tle aplikacji. Podczas gdy wątki użytkownika są tworzone przy pierwszym uruchomieniu aplikacji.
Zalety pojedynczego wątku:
- Narzut aplikacji jest zmniejszony, ponieważ w systemie występuje pojedynczy wątek.
- Koszt utrzymania aplikacji jest redukowany dzięki zastosowaniu pojedynczych wątków.
Wielozadaniowość w Javie
Wielozadaniowość odnosi się do procesu wykonywania wielu zadań przez procesor jednocześnie. Czasami przełączanie procesora może być wykonywane między zadaniami przez użytkownika w celu wspólnej współpracy z każdym programem. Procesom wielozadaniowym przydzielana jest osobna pamięć i zasoby. Wielozadaniowość można osiągnąć na dwa sposoby.
1. Wielozadaniowość (wielozadaniowość oparta na procesach)
- Dla każdego procesu przydzielany jest oddzielny obszar pamięci. Dlatego w pamięci znajduje się adres dla każdego procesu.
- Procesy są ciężkie.
- Koszt komunikacji między procesami jest wysoki.
- Potrzeba trochę czasu na przełączanie między procesami. Jest to wymagane do aktualizacji list, map pamięci itp.
2. Wielowątkowość (wielozadaniowość oparta na wątkach)
- Ten sam adres jest współdzielony przez wątki.
- Nici są lekkie.
- Koszt komunikacji między wątkami jest niski.
Co to jest wielowątkowość?
Gdy dwa lub więcej wątków jest wykonywanych w programie jednocześnie, mechanizm jest określany jako wielowątkowość. Pojedynczy proces tworzy wiele wątków, zwiększając moc obliczeniową. Dwie lub więcej części programu są wykonywane w sposób, który prowadzi do maksymalnego wykorzystania procesora.
Wątki nazywane są poszczególnymi częściami programu. Procesy w aplikacji mogą zawierać wiele wątków lub pojedyncze wątki.
Wirtualna maszyna języka Java zezwala na wiele wątków aplikacji. Każdy wątek ma swój własny priorytet. Dlatego pierwszeństwo wykonania mają wątki o wyższym priorytecie niż te, które mają niższy priorytet.
Aby osiągnąć wielozadaniowość, stosuje się zarówno proces wielowątkowości, jak i wieloprocesowości. Ponieważ obszar pamięci współdzielonej jest używany w wielowątkowości, jest on najczęściej używany w przypadku przetwarzania wieloprocesowego. Pamięć jest zapisywana, ponieważ nie jest wymagana dodatkowa alokacja pamięci. Co więcej, czas potrzebny na przetwarzanie jest krótszy niż wieloprocesorowość, ponieważ przełączanie kontekstu odbywa się między wątkami.
W animacji, grach używa się wielowątkowości Java . Kliknij, jeśli chcesz dowiedzieć się więcej o architekturze i komponentach Java.
Do tworzenia wątków można użyć dwóch mechanizmów.
1. Rozszerzenie klasy wątku
2. Implementacja Runnable Interface
Klasa wątku a uruchamialny interfejs
- Rozszerzenie „klasy wątków” nie może rozszerzyć innych klas, ponieważ wielokrotne dziedziczenie nie jest obsługiwane w Javie. Ale dzięki implementacji interfejsu „Runnable” inne klasy bazowe mogą zostać rozszerzone z tej klasy.
- Podstawową funkcjonalność wątku można rozszerzyć poprzez rozszerzenie klasy Thread, ponieważ udostępniane są metody wbudowane, takie jak przerwanie(), yield() itp.
- Obiekt, który może współużytkować wiele wątków, zostanie udostępniony, gdy zostanie użyta opcja runnable.
Klasa Java Thread
Programowanie wątków w Javie jest osiągane przez klasę wątków. Konstruktory są dostarczane przez klasę wątków i metody wykonywania operacji wątków. Klasa wątku implementuje uruchamialny interfejs i rozszerza klasę Object.
Kilka powszechnie stosowanych metod gwintowania to:
- start(): wykonywanie wątku jest uruchamiane przez tę metodę. Metoda run() jest wywoływana przez JVM.
- sleep(int milliseconds): Wykonywanie wątku jest wstrzymywane na milisekundy, które są dostarczane, gdy proces wątkowania przechodzi w stan uśpienia za pomocą tej metody. Po przerwie wykonanie wątku rozpoczyna się od nowa. Za pomocą tej metody można synchronizować wątki.
- getName(): nazwa wątku jest zwracana przez tę metodę.
- setPriority(int new priority): Za pomocą tej metody zmieniany jest priorytet wątku.
- yield (): Bieżący wątek zostaje zatrzymany wraz z wykonaniem innych wątków tą metodą.
- run(): Metoda służy do uruchamiania akcji w wątku.
- getPriority(): przy użyciu tej metody zwracany jest priorytet wątku.
- setName(): nazwa wątku jest zmieniana za pomocą tej metody.
- getId(): identyfikator wątku jest zwracany przez tę metodę.
- suspend(): wątek jest zawieszany za pomocą tej metody.
Cykl życia wątku
Cykl życia wątku składa się z różnych etapów, które wymieniono poniżej:
- Nowość: „Klasa wątku” służy do tworzenia wątku na tym etapie. Do momentu uruchomienia wątku program pozostaje na tym etapie. Metoda ta nazywana jest również wątkiem zrodzonym.
- Runnable: Metoda start wywołuje wystąpienie wątku na tym etapie cyklu życia wątku. Harmonogram otrzymuje kontrolę nad wątkiem w celu zakończenia realizacji. To, czy wątek powinien zostać wykonany, czy nie, zależy od harmonogramu.
- Uruchomiony: Po rozpoczęciu wykonywania wątku etap zostaje przesunięty do etapu „uruchamiania”. Jeden wątek jest wybierany przez planistę z puli wątków i rozpoczyna wykonywanie aplikacji.
- Oczekiwanie : Jak sama nazwa wskazuje, w tej fazie cyklu życia wątek czeka. Synchronizacja wątków jest niezbędna ze względu na działanie wielu wątków w aplikacji. W związku z tym istnieje konieczność, aby wątek czekał, aż zakończy się wykonanie drugiego wątku. Dlatego etap cyklu życia jest również nazywany etapem oczekiwania.
- Martwy: etap, w którym następuje zakończenie wątku, jest określany jako etap „martwy”. Gdy wątek zostanie przeniesiony z działania do końca przetwarzania, zostaje zakończony, a zatem znajduje się w „stanie martwym”
Synchronizacja wątków w Javie
Zachowanie asynchroniczne występuje w programie w przypadku wielowątkowości. Jeśli przypuszczalnie dane są zapisywane przez jeden wątek, a odczytywanie danych odbywa się jednocześnie przez inny wątek, w aplikacji może powstać niespójność.
Zasoby współużytkowane przez wątki muszą być dostępne dla innych wątków. Dlatego w takich przypadkach podchodzi się do podejścia synchronizacji. Zsynchronizowane metody są dostępne w Javie, aby osiągnąć zachowanie synchronizacji.
Gdy wątek dociera do zsynchronizowanego bloku, po osiągnięciu metody nie mogą być wywołane przez inne wątki tego samego obiektu. Dopóki wątek nie zakończy wykonywania bloku i nie wyjdzie z niego, inne wątki muszą się zatrzymać i czekać.
Ucz się kursów oprogramowania online z najlepszych światowych uniwersytetów. Zdobywaj programy Executive PG, Advanced Certificate Programs lub Masters Programs, aby przyspieszyć swoją karierę.
Zalety wielowątkowości
- Wiele operacji może być wykonywanych jednocześnie. Przy uruchomionych niezależnych wątkach użytkownik nie jest blokowany.
- Czas jest oszczędzany, ponieważ wiele operacji jest wykonywanych razem.
- Na wątek nie może wpływać inny wątek, ponieważ są one niezależne. Wystąpienie wyjątku w jednym wątku nie wpływa na wykonywanie innych wątków.
Przykład wielowątkowości
Przykład programu wielowątkowego w javie pokazano poniżej:
Źródło
Rysunek 1: Fragment przykładowego kodu wielowątkowego
Wyjaśnienie kodu
Linia 3: Klasa „GuruThread1” implementuje runnable.
Linia 8: Wyświetla główną metodę klasy.
Linia 9: tworzona jest instancja klasy wątku, tworzona jest instancja „guruThread1” i tworzony jest wątek.
Linia 10: tworzona jest instancja „klasy wątków” i instancja „guruThread2” oraz wątek.
Linia 11: Wątek o nazwie guruThread1 został uruchomiony.
Linia 12: Wątek o nazwie guruThread2 został uruchomiony.
Linia 13: Wyprowadzany jest tekst „Nazwy wątków są następujące:”.
Linia 14: Metoda getName() służy do pobrania nazwy wątku1.
Linia 15: Metoda getName() służy do pobrania nazwy wątku2.
Wykonanie powyższego kodu skutkuje następującymi danymi wyjściowymi:
Źródło
Rysunek: Zrzut ekranu danych wyjściowych wygenerowanych z programu wielowątkowego w Javie (pobrane z
Wniosek
W artykule omówiono koncepcję wielowątkowości w Javie wraz z przykładem programu wielowątkowego w Javie. Twoja nauka nie kończy się tutaj i dogaduje się ze wszystkimi innymi podstawowymi koncepcjami Javy.
Jeśli jesteś zainteresowany doskonaleniem swoich umiejętności programowania w przyjaznej cenie i przygotowaniem się do pracy w branży, możesz sprawdzić kurs oferowany przez uaktualnienie „Master of Science in Computer Science”. Jest przeznaczony dla wszystkich profesjonalistów średniego szczebla w grupie wiekowej od 21 do 45 lat. Kurs jest certyfikowany przez Liverpool John Moores University i obejmuje ponad 500 godzin nauki, 309 projektów i zadań, aby wydobyć z Ciebie to, co najlepsze. Jeśli masz jakiekolwiek pytania, napisz do nas, nasz zespół skontaktuje się z Tobą.