veröffentlicht am: 21.06.2022 zuletzt aktualisiert am: 19.04.2023
Beim Arbeiten in einer Multi-Thread-Umgebung können mehrere Threads (auch: Vorgänge) versuchen, auf die gleiche, blockierte Ressource zuzugreifen. In einer solchen Situation kann eine fehlerhafte Verwaltung dieser Threads zu Inkonsistenzen führen. In Java kannst du die sog. „guarded blocks“ verwenden, um die Operationen mehrerer Threads zu koordinieren. Diese Blöcke prüfen, ob eine bestimmte Bedingung erfüllt ist, bevor die Ausführung des Threads fortgesetzt wird.
Genauer gesagt wird die Java wait() Methode von diesen Blöcken verwendet, um die Ausführung eines Threads auszusetzen, und die Methode „notify()„, um den Thread in der Warteschlange wieder aufzuwecken.
In diesem Artikel wird die Funktionsweise und Verwendung der Java Methode wait() erläutert. So, lass uns loslegen!
Die Klasse „java.lang.Object“ enthält die Methode „wait()„. Wenn diese „wait()“ Methode für ein Objekt aufgerufen wird, wechselt der zugehörige Thread vom „running“ (“laufenden“) in einen „waiting“ (“wartenden“) Zustand. Danach wartet er darauf, dass ein anderer Thread die Methode „notify()“ oder „notifyAll()“ aufruft, um den Thread wieder in den „runnable“ (“lauffähigen“) Zustand zu versetzen.
Syntax
wait()
„Synchronisierte“ Blöcke und Methoden in Java erlauben nur einem Thread, eine Ressource zu blockieren. Wenn also der Java Thread die Methode „wait()“ aufruft, gibt er die Sperre dieser spezifischen Ressource frei, und der Thread wird zur Warteschlange hinzugefügt, bis ein anderer Thread die Methoden „notifyAll()“ oder „notify()“ aufruft.
Die Methode „notify()“ kann immer nur einen Thread aufwecken, während die Methode „notifyAll()“ alle Threads aufwecken kann, die sich auf dasselbe Objekt beziehen und zuvor der Warteschlange hinzugefügt wurden. Beide Java Methoden geben die Blockierung des Objekts nicht frei, sondern werden dazu verwendet, die zur Warteschlange hinzugefügten Threads aufzuwecken.
Sehen wir uns nun die Implementierung der Java Methode „wait()“ an.
Betrachten wir ein Szenario, in dem insgesamt 50 Schüler in der Klasse sind. Der Unterricht beginnt erst, wenn alle Schüler/innen eingetroffen sind. Um das zu ermöglichen werden wir mit der Java wait()-Methode arbeiten!
class Student { int noOfStudents = 50; synchronized void printStudentDetails(int students) { int stdCount = 0; while (stdCount < 50) { stdCount++; } if (noOfStudents < students) { System.out.println("Wir haben zu wenig Schüler im Klassenraum!"); try { System.out.println("Warten wir lieber mal auf die restlichen Schüler..."); wait(); } catch (Exception e) {} } System.out.println("Anzahl der Schüler (nach der notify()-Methode): " + noOfStudents); System.out.println("Wir haben genug Schüler beisammen"); System.out.println("Der Unterricht beginnt nun!"); } synchronized void addStudent(int noOfStudents) { this.noOfStudents += noOfStudents; notify(); } }
In der Methode „main()“ unserer Klasse „Main“ deklarieren wir eine Instanz der Klasse „Student“ und erstellen zwei neue Threads. Beide Threads werden die Methode „printStudentDetails“ aufrufen, nur mit unterschiedlichen Parametern:
public class Main { public static void main(String[] args) { Student stdObj = new Student(); new Thread() { @Override public void run() { stdObj.printStudentDetails(60); } }.start(); new Thread() { @Override public void run() { stdObj.printStudentDetails(50); } }.start(); } }
Das oben stehende Programm wird in den folgenden Schritten ausgeführt:
Das waren alle wesentlichen Informationen über die Java Methode „wait()„. Du kannst bei Bedarf gerne weiter recherchieren.
Die Methode Java wait() ist ein Teil der Klasse „java.lang.Object„, die bei einem Objekt aufgerufen wird, um den zugehörigen Thread von einem „running“ (“laufenden“) in einen „waiting“ (“wartenden“) Zustand zu versetzen. Danach wartet sie darauf, dass ein anderer Thread die Methode „notify()“ oder „notifyAll()“ aufruft, um den Thread wieder in den „runnable“ (“lauffähigen“) Zustand zu versetzen, der sich in der Warteschlange befindet. In diesem Beitrag haben wir die Funktionsweise der Java Methode wait() besprochen und ihre Verwendung anhand eines geeigneten Beispiels demonstriert. Falls du mehr über Java lernen willst, schau hier nach!
😩 Gelangweilt von den Udemy & YouTube-Tutorials?!
Lerne spielerisch Java und komme deiner gutbezahlten (und an der 🌴 liegenden) Traumkarriere einen Schritt weiter.
"Für Leute die gerne Python oder Java lernen wollen ist Codegree klasse. Ist nicht wie bei anderen Konkurrenten auf Videokursen aufgebaut..."
- Lennart Sparbier
100% kostenlos registrieren · keine Kreditkarte notwendig
Im Gegensatz zu der Abendschule oder der alteingesessenen Uni lernst du bei codegree die Sprachen & Pakete, die wirklich im Jobmarkt gesucht werden.
100% kostenlos registrieren · keine Zahlungsdaten notwendig