Jaka jest różnica między metodami wait() i sleep() w Javie?

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:

  1. Obiekt lock: Jest używany do synchronizacji, co oznacza, że wait() i notify()/notifyAll() muszą być wywoływane w bloku synchronizowanym na tym samym obiekcie.
  2. Wątek czekający (waitingThread): Używa metody wait(), która sprawia, że wątek zwalnia blokadę na obiekcie lock i czeka, aż inny wątek wywoła notify() lub notifyAll() na tym samym obiekcie.
  3. 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.

Scroll to Top