Java-Thread-Klasse
Die Thread-Klasse ist eine Kernklasse in Java zum Erstellen und Verwalten von Threads.
In Java ist jeder Thread eine Instanz der Thread-Klasse. Ein Thread kann als eine unabhängig ausgeführte "Teilaufgabe" in einem Programm verstanden werden, wodurch das Programm mehrere Vorgänge gleichzeitig ausführen kann.
Es gibt zwei Möglichkeiten, Threads in Java zu erstellen:
- Die Thread-Klasse erweitern
- Das Runnable-Interface implementieren
Grundlegende Verwendung der Thread-Klasse
Threads erstellen
Beispiel
class MyThread extends Thread {
public void run() {
System.out.println("Thread is running");
}
}
// Methode 2: Das Runnable-Interface implementieren
class MyRunnable implements Runnable {
public void run() {
System.out.println("Thread is running");
}
}
public class Main {
public static void main(String[] args) {
// Verwendung des Vererbungsansatzes
MyThread thread1 = new MyThread();
thread1.start();
// Verwendung des Interface-Ansatzes
Thread thread2 = new Thread(new MyRunnable());
thread2.start();
}
}
Thread-Lebenszyklus
Java-Threads haben die folgenden Zustände:
- NEW: Neu erstellter Thread, die start()-Methode wurde noch nicht aufgerufen
- RUNNABLE: Lauffähiger Zustand, kann ausgeführt werden oder auf CPU-Zeit warten
- BLOCKED: Thread ist blockiert und wartet darauf, die Monitor-Sperre zu erwerben
- WAITING: Wartezustand, wartet darauf, dass andere Threads bestimmte Operationen ausführen
- TIMED_WAITING: Zeitlich begrenzter Wartezustand
- TERMINATED: Thread wurde beendet
Häufige Methoden der Thread-Klasse
Grundlegende Steuerungsmethoden
Beispiel
System.out.println("Thread executing");
});
thread.start(); // Thread starten
thread.join(); // Warte, bis der Thread beendet ist
thread.sleep(1000); // Thread schläft 1 Sekunde
Thread-Priorität
Beispiel
thread.setPriority(Thread.NORM_PRIORITY); // Standardpriorität (5)
thread.setPriority(Thread.MIN_PRIORITY); // Niedrigste Priorität (1)
Thread-Unterbrechung
Beispiel
// Interrupt-Status im Thread prüfen
if (Thread.interrupted()) {
// Interrupt-Logik behandeln
}
Thread-Synchronisation
Wenn mehrere Threads auf gemeinsam genutzte Ressourcen zugreifen, müssen Synchronisationsmechanismen verwendet werden, um Probleme mit Dateninkonsistenzen zu vermeiden.
Verwendung des synchronized-Schlüsselworts
Beispiel
private int count = 0;
public synchronized void increment() {
count++;
}
}
Verwendung der Lock-Schnittstelle
Beispiel
import java.util.concurrent.locks.ReentrantLock;
class Counter {
private int count = 0;
private Lock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
}
Thread-Pool⟦
In der tatsächlichen Entwicklung werden Thread-Pools üblicherweise verwendet, um Threads zu verwalten, anstatt Thread-Objekte zu erstellen.
Beispiel
import java.util.concurrent.Executors;
public class ThreadPoolExample {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i < 10; i++) {
executor.execute(() -> {
System.out.println("Thread executing task");
});
}
executor.shutdown();
}
}
Best Practices
- Bevorzugen Sie das Erstellen von Threads über das Runnable-Interface
- Verwenden Sie Thread-Pools, um Thread-Ressourcen zu verwalten
- Vermeiden Sie übermäßige Synchronisation; verwenden Sie Synchronisationsmechanismen nur, wenn nötig
- Verwenden Sie das Schlüsselwort volatile, um die Sichtbarkeit von Variablen sicherzustellen
- Erwägen Sie die Verwendung der fortgeschrittenen Hilfsklassen im Java-Nebenläufigkeitspaket (java.util.concurrent)
Durch die sinnvolle Nutzung der Klasse Thread und verwandter Nebenläufigkeitswerkzeuge können Sie effiziente und zuverlässige Multithread-Java-Programme schreiben.
Weitere Erweiterungen