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.

