Runnable vs klasa Thread w Javie

W Javie wielowątkowość jest kluczowym mechanizmem pozwalającym na równoczesne wykonywanie wielu zadań w ramach jednego procesu. Java oferuje dwa główne sposoby tworzenia wątków: poprzez implementację interfejsu Runnable oraz przez dziedziczenie z klasy Thread. Wybór między tymi dwoma podejściami zależy od konkretnych wymagań aplikacji i preferowanego stylu programowania.

Runnable vs Thread

  • Interfejs Runnable jest zalecany, gdy klasa już dziedziczy z innej klasy, ponieważ Java nie wspiera wielodziedziczenia.
  • Klasa Thread może być wykorzystana, gdy tworzenie klasy wątku nie wymaga dziedziczenia z innej klasy.

Przykład użycia Runnable

Załóżmy, że chcemy zaimplementować zadanie, które symuluje monitorowanie zasobów systemu. Użyjemy interfejsu Runnable do tego celu.

// Klasa MonitorResource implementująca interfejs Runnable
public class ResourceMonitor implements Runnable {
    private String resource;

    // Konstruktor przyjmujący nazwę zasobu
    public ResourceMonitor(String resource) {
        this.resource = resource;
    }

    // Metoda run zawierająca logikę monitorowania
    @Override
    public void run() {
        System.out.println("Monitoring resource: " + resource);
    }
}

Następnie użyjemy tej klasy do utworzenia i uruchomienia wątku:

public class MonitorTest {
    public static void main(String[] args) {
        ResourceMonitor monitor = new ResourceMonitor("CPU");
        Thread thread = new Thread(monitor);
        thread.start();
    }
}

Przykład użycia klasy Thread

Jeśli chcemy utworzyć wątek, który nie wymaga dostępu do metod innej klasy poza Thread, możemy po prostu rozszerzyć klasę Thread.

// Klasa BackupTask dziedzicząca z klasy Thread
public class BackupTask extends Thread {
    private String fileName;

    // Konstruktor przyjmujący nazwę pliku do backupu
    public BackupTask(String fileName) {
        this.fileName = fileName;
    }

    // Metoda run zawierająca logikę backupu
    @Override
    public void run() {
        System.out.println("Backing up file: " + fileName);
    }
}

Aby uruchomić wątek, wystarczy utworzyć obiekt BackupTask i wywołać metodę start():

public class BackupTest {
    public static void main(String[] args) {
        BackupTask task = new BackupTask("database.txt");
        task.start();
    }
}

Podsumowanie

Wybór między użyciem interfejsu Runnable a rozszerzeniem klasy Thread zależy od konkretnych wymagań aplikacji. Użycie Runnable jest bardziej elastyczne i zalecane, gdy klasa już dziedziczy po innej klasie. Rozszerzenie klasy Thread jest prostsze i może być używane, gdy nie ma potrzeby dziedziczenia z innej klasy. Oba podejścia są używane do realizacji wielowątkowości w Javie, jednak wybór najlepszego rozwiązania zależy od specyfiki zadania i architektury aplikacji.

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