Czy można wywołać metodę run() zamiast start() na wątku w Javie?

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

  1. Definicja klasy NumberPrinter: Klasa rozszerza Thread, co pozwala jej działać jako wątek. Metoda run() jest nadpisana, aby określić, co ma robić wątek – w tym przypadku wypisuje liczby od 1 do 5.
  2. 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.
  3. 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.
  4. Użycie run() i start(): Wywołanie run() bezpośrednio powoduje, że kod jest wykonywany w bieżącym wątku (wątek główny), a nie uruchamia nowego wątku. W przypadku start() tworzony jest nowy wątek, a metoda run() 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.

Scroll to Top