Warum verwende ich Threads? Wie startet man einen Thread? Was ist ein Deadlock bei mehreren Threads?

Warum verwende ich Threads?

Threads werden verwendet, um mehrere Aufgaben oder Tasks nebeneinander auszuführen. Benötigt eine Aufgabe (z.B. Dateidownload) viel Zeit, ist es sinnvoll, diese Aufgabe in einem eigenen Thread auszuführen. Damit ist es möglich, dass das Programm während des Downloads andere Tasks ausführt. Solche Tasks könnten die Abarbeitung einer Benutzereingabe oder die Aktualisierungen der Fortschrittsanzeige sein.

Wie startet man einen Thread in Java?
Thread t = new Thread() {
    @Override
    public void run() {
        // Code der im Thread ausgeführt wird
    }
};
t.start();

In Zeile 1 wird ein neues Thread-Objekt t erzeugt.
Ab Zeile 3 wird die Methode run() der Klasse Thread implementiert. Diese Methode enthält den Code, der nebenläufig ausgeführt werden soll.
In Zeile 7 wird der Thread t gestartet.

Achtung: Startet man die run-Methode mit t.run(), wird die Methode nicht nebenläufig im Thread ausgeführt, sondern als normaler Methodenaufruf abgearbeitet. Das heißt, die weitere Ausführung des Programms wird blockiert, bis die Methode run() beendet ist.

Was ist ein Deadlock?

Deadlocks entstehen, wenn zwei Threads wechselseitig auf eine Ressource warten, die der jeweils andere Thread für sich beansprucht.

Beispiel: Thread t1 und Thread t2 wollen auf die Dateien a und b schreibend zugreifen.
Für den schreibenden Zugriff benötigen Threads einen exklusiven Zugriff auf die Datei, damit nicht abwechselnd unterschiedliche Threads in eine Datei schreiben können.
Thread t1 öffnet die Datei a. Thread t2 öffnet die Datei b. Im Anschluss daran möchte t1 die Datei b öffnen und t2 die Datei a. Thread t1 kann die Datei b nicht öffnen, weil sie bereits von t2 geöffnet ist. Beide Threads warten an dieser Stelle also darauf, dass der jeweils andere Thread die Datei schließt.

Beispiel aus dem Alltag: 4 Fahrzeuge stehen an einer Kreuzung. Gemäß der Rechtsregel wartet jedes Fahrzeug darauf, dass das von rechts kommende Fahrzeug die Kreuzung passiert.