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
Threadi nadpisując metodęrun(). Inna opcja to dostarczenie obiektu implementującego interfejsRunnabledo 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 obiektThreaddla 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
Threaddostarcza 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
Threaddostarcza mechanizmy synchronizacji, takie jaksynchronizeddo 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.

