Działanie Klasy ‘Thread’
Klasa Thread
w Javie jest podstawowym narzędziem do tworzenia i zarządzania wątkami. Umożliwia programistom tworzenie wielowątkowych aplikacji, co pozwala na równoczesne wykonywanie różnych fragmentów kodu. Oto kilka kluczowych aspektów działania klasy Thread
:
-
Tworzenie Wątku:
-
Możesz utworzyć nowy wątek, dziedzicząc z klasy
Thread
i nadpisując metodęrun()
. Inna opcja to dostarczenie obiektu implementującego interfejsRunnable
do konstruktoraThread
. -
Przykład dziedziczenia z
Thread
:
-
class MyThread extends Thread {
public void run() {
// Kod, który ma być wykonany w nowym wątku
}
}
MyThread myThread = new MyThread();
myThread.start(); // Uruchomienie nowego wątku
- Przykład implementacji
Runnable
:
class MyRunnable implements Runnable {
public void run() {
// Kod, który ma być wykonany w nowym wątku
}
}
Thread myThread = new Thread(new MyRunnable());
myThread.start(); // Uruchomienie nowego wątku
- Uruchamianie Wątku:
-
- Wątek nie jest uruchamiany za pomocą metody
run()
, ale zamiast tego używa się metodystart()
. Metodastart()
inicjuje nowy wątek i wywołuje jego metodęrun()
w oddzielnym wątku. - Wywołanie
start()
kilka razy dla tego samego obiektu wątku jest niedozwolone. Możesz utworzyć nowy obiektThread
dla każdego wątku.
- Wątek nie jest uruchamiany za pomocą metody
-
Metoda run():
- Metoda
run()
zawiera kod, który zostanie wykonany w nowym wątku. Jeśli korzystasz z dziedziczenia, to ta metoda musi zostać nadpisana. - Metoda
run()
definiuje zadanie, które wątek ma wykonać. Wątek kończy swoje działanie, gdy metodarun()
zostanie zakończona.
- Metoda
-
Stan Wątku:
- Wątek może znajdować się w różnych stanach, takich jak
NEW
,RUNNABLE
,BLOCKED
,WAITING
,TIMED_WAITING
,TERMINATED
. - Metoda
getState()
pozwala na sprawdzenie aktualnego stanu wątku.
- Wątek może znajdować się w różnych stanach, takich jak
-
Zarządzanie Wątkiem:
- Klasa
Thread
dostarcza różne metody do zarządzania wątkiem, takie jaksleep(long millis)
do uśpienia wątku na określony czas,yield()
do “oddania” czasu CPU innym wątkom,join()
do oczekiwania na zakończenie innego wątku itp.
- Klasa
-
Synchronizacja:
- Klasa
Thread
dostarcza mechanizmy synchronizacji, takie jaksynchronized
do unikania wyścigów (race conditions) między wątkami, orazwait()
inotify()
do obsługi komunikacji między wątkami.
- Klasa
-
Interrupts:
- Wątki mogą być przerwane za pomocą metody
interrupt()
. Przerwanie wątku powoduje zgłoszenie wyjątkuInterruptedException
, co umożliwia bezpieczne zakończenie wątku.
- Wątki mogą być przerwane za pomocą metody
Klasa Thread
w Javie dostarcza wiele funkcji do zarządzania wątkami. Oto kilka podstawowych metod tej klasy:
start()
: Rozpoczyna wykonywanie nowego wątku, wywołując jego metodęrun()
. Metodarun()
zawiera kod, który będzie wykonywany w nowym wątku.
Thread thread = new Thread(myRunnable);
thread.start();
sleep(long millis)
: Powoduje zatrzymanie bieżącego wątku na określoną liczbę milisekund.
try {
Thread.sleep(1000); // zatrzymaj wątek na 1 sekundę
} catch (InterruptedException e) {
// obsługa przerwania
}
join()
: Czeka, aż wątek, na którym została wywołana metoda, zakończy wykonanie.
Thread thread = new Thread(myRunnable);
thread.start();
try {
thread.join(); // czekaj, aż wątek zakończy wykonanie
} catch (InterruptedException e) {
// obsługa przerwania
}
isAlive()
: Sprawdza, czy wątek jest nadal aktywny.
if (thread.isAlive()) {
// wątek jest nadal aktywny
} else {
// wątek zakończył wykonanie
}
getId()
: Zwraca unikalny identyfikator wątku.
long threadId = thread.getId();
interrupt()
: Przerywa bieżący wątek. Wątek, który został przerwany, powinien regularnie sprawdzać, czy został przerwany, za pomocą metodyisInterrupted()
.
thread.interrupt();
To są tylko podstawowe funkcje klasy Thread
. Warto zauważyć, że bezpieczne zarządzanie wątkami wymaga uwzględnienia obsługi przerwań (InterruptedException
) oraz ostrożności w korzystaniu z metod synchronizacji w celu uniknięcia problemów z dostępem wielowątkowym.
Ważne jest zaznaczenie, że korzystanie z klasy Thread
bezpośrednio jest jednym ze starszych podejść do wielowątkowości w Javie, a w nowszych wersjach Javy preferuje się korzystanie z interfejsu Runnable
lub z użyciem klas z pakietu java.util.concurrent
oraz java.util.concurrent.atomic
.