W programowaniu wielowątkowym w Javie, jednym z kluczowych elementów jest prawidłowe zarządzanie wątkami. W Javie każdy wątek jest instancją klasy Thread
lub klasy pochodnej. Wątek można uruchomić używając metody start()
, która inicjuje nowy wątek i wywołuje metodę run()
. Często jednak programiści zastanawiają się, czy możliwe jest bezpośrednie wywołanie metody run()
zamiast start()
. W tej lekcji przeanalizujemy, co się stanie, gdy użyjemy run()
bezpośrednio, i jakie są tego konsekwencje.
Przykład użycia run()
i start()
Poniższy przykład ilustruje różnicę między wywołaniem run()
a start()
na przykładzie prostego wątku, który wypisuje liczby od 1 do 5.
// Definicja klasy jako rozszerzenie klasy Thread
class NumberPrinter extends Thread {
public void run() { // Metoda, która zostanie wykonana przez wątek
for (int i = 1; i <= 5; i++) {
// Wypisz aktualny numer
System.out.println(i + " - Wątek: " + Thread.currentThread().getName());
try {
// Usypiaj wątek na 500 milisekund
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// Klasa główna z metodą main
public class ThreadExample {
public static void main(String[] args) {
// Tworzenie instancji klasy NumberPrinter
NumberPrinter printer = new NumberPrinter();
// Wywołanie metody run() bezpośrednio
System.out.println("Wywołanie metody run():");
printer.run();
// Wywołanie metody start() do uruchomienia nowego wątku
System.out.println("Uruchomienie wątku za pomocą start():");
printer = new NumberPrinter(); // Utworzenie nowej instancji
printer.start();
}
}
Komentarze do kodu
- Definicja klasy
NumberPrinter
: Klasa rozszerzaThread
, co pozwala jej działać jako wątek. Metodarun()
jest nadpisana, aby określić, co ma robić wątek – w tym przypadku wypisuje liczby od 1 do 5. - Wypisywanie informacji o wątku: Używamy
Thread.currentThread().getName()
do uzyskania nazwy aktualnie działającego wątku, co pozwala na obserwację działania programu w różnych wątkach. - Zarządzanie czasem:
Thread.sleep(500)
usypia wątek na 500 ms po każdym wypisaniu liczby, co pozwala zobaczyć interwały czasowe między kolejnymi iteracjami. - Użycie
run()
istart()
: Wywołanierun()
bezpośrednio powoduje, że kod jest wykonywany w bieżącym wątku (wątek główny), a nie uruchamia nowego wątku. W przypadkustart()
tworzony jest nowy wątek, a metodarun()
jest wywoływana w jego kontekście.
Podsumowanie
Wywołanie metody run()
bezpośrednio w klasie Thread
spowoduje wykonanie kodu w bieżącym wątku bez uruchamiania nowego wątku. Oznacza to, że metoda run()
zachowuje się jak normalna metoda i nie korzysta z zalet programowania wielowątkowego. Natomiast użycie start()
tworzy nowy wątek, co jest kluczowe dla efektywnego wykorzystania wielowątkowości w Javie.
Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs video Java w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.