W programowaniu w języku Java, zarządzanie wątkami jest kluczowym aspektem tworzenia efektywnych i efektywnie działających aplikacji. Dwie podstawowe metody, które są często stosowane do zarządzania wątkami, to wait()
i sleep()
. Choć obie metody są używane do pauzowania działania wątku, różnią się znacząco pod względem działania i kontekstu ich zastosowania.
Przykład zastosowania wait()
i sleep()
w Javie
Aby lepiej zrozumieć różnice między wait()
i sleep()
, przyjrzymy się przykładowemu kodowi, który demonstruje ich użycie. Poniżej znajdziesz kod z komentarzami wyjaśniającymi działanie poszczególnych linii.
public class ThreadExample {
// Główny obiekt, używany do synchronizacji
private static final Object lock = new Object();
public static void main(String[] args) throws InterruptedException {
Thread waitingThread = new Thread(new Runnable() {
public void run() {
try {
synchronized (lock) {
// Czeka na powiadomienie od innego wątku
System.out.println("Wątek czekający: Czekam...");
lock.wait();
System.out.println("Wątek czekający: Zostałem obudzony!");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread sleepingThread = new Thread(new Runnable() {
public void run() {
try {
// Wątek śpi przez 2 sekundy
System.out.println("Wątek śpiący: Śpię...");
Thread.sleep(2000);
synchronized (lock) {
// Obudzenie czekającego wątku
lock.notifyAll();
System.out.println("Wątek śpiący: Obudziłem wątek czekający!");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
waitingThread.start();
Thread.sleep(500); // Krótkie opóźnienie, aby upewnić się, że wątek czekający już czeka
sleepingThread.start();
}
}
Wyjaśnienie kodu:
- Obiekt lock: Jest używany do synchronizacji, co oznacza, że
wait()
inotify()
/notifyAll()
muszą być wywoływane w bloku synchronizowanym na tym samym obiekcie. - Wątek czekający (waitingThread): Używa metody
wait()
, która sprawia, że wątek zwalnia blokadę na obiekcielock
i czeka, aż inny wątek wywołanotify()
lubnotifyAll()
na tym samym obiekcie. - Wątek śpiący (sleepingThread): Wywołuje
Thread.sleep()
, co powoduje, że wątek ten jest wstrzymywany, ale nie zwalnia żadnych blokad, które mógłby posiadać. Po upływie czasu snu wątek kontynuuje działanie.
Podsumowanie
Metoda sleep()
jest używana do wstrzymywania wątku na określony czas bez zwalniania jakichkolwiek blokad, natomiast wait()
pozwala wątkowi czekać na powiadomienie od innego wątku i wymaga znajdowania się w bloku synchronizowanym. Te różnice są kluczowe przy projektowaniu wielowątkowych aplikacji w Javie, gdzie nieprawidłowe użycie tych metod może prowadzić do problemów takich jak zakleszczenia lub nadmierne zużycie zasobów.
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.