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.