CodeBlanks Logo Icon CodeBlanks

wait ve notify

wait ve notify ile iş parçacığı iletişimini öğrenirsin.

wait ve notify

wait() ve notify(), Object üzerinde tanımlı yöntemlerdir; bir kilit üzerinde bekleyen ve uyandıran iş parçacıkları arasında iletişim kurar. Her ikisi de synchronized blok içinden çağrılmalıdır.

synchronized (lock) {
    while (!ready) lock.wait();
}
synchronized (lock) {
    ready = true;
    lock.notify();
}

Bu, üretici-tüketici gibi desenlerin temelidir. wait kilidi bırakıp bekler; notify bekleyen bir iş parçacığını uyandırır. notifyAll tüm bekleyenleri uyandırır. Bu, koşul değişkenlerinin Java'daki karşılığıdır.

Üretici-tüketici deseni

Bir üretici, veriyi kuyruğa ekler ve notify çağırır; bir tüketici kuyruk boşsa wait ile bekler. Bu, klasik üretici-tüketici desenidir.

synchronized (queue) {
    while (queue.isEmpty()) queue.wait();
    item = queue.remove(0);
}

Koşul while ile denetlenir; if yetersizdir çünkü uyanma ile koşul arasında başka bir iş parçacığı araya girebilir. Bu nazik uyandırma yarışını önler. Java'da BlockingQueue bu deseni hazır sunar.

Uygulama Signal ile wait/notify uygula

Bir Signal sınıfı tanımla; boolean sent = false alanı olsun. synchronized void send() yöntemi sent = true yapsın ve notify() çağırsın. synchronized void await() yöntemi while (!sent) wait() döngüsü içersin (try/catch ile InterruptedException yakala). Bir SignalDemo sınıfında main yaz; send() çağır, await() çağır ve System.out.println("Done") yazdır.

Başlangıç kodu

Main.java
// Signal sınıfını tanımla (sent alanı, send ve await yöntemleri)

// SignalDemo sınıfında main yaz; send ve await çağır, sonra Done yazdır

Örnek çözüm

Main.java
class Signal {
    boolean sent = false;
    synchronized void send() {
        sent = true;
        notify();
    }
    synchronized void await() {
        while (!sent) {
            try { wait(); } catch (InterruptedException e) {}
        }
    }
}

class SignalDemo {
    public static void main(String[] args) {
        Signal s = new Signal();
        s.send();
        s.await();
        System.out.println("Done");
    }
}

Beklenen çıktı

Done

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 wait çağrısını tamamla

Soru
synchronized (lock) {
    while (!ready) lock.____();
}
Cevap
synchronized (lock) {
    while (!ready) lock.wait();
}

Açıklama: wait() kilidi bırakıp bekler.

2 wait() çağrıldığında kilit ne olur?

  • Kilit kalır, bekler
  • Kilit yok edilir
  • Kilit bırakılır ve beklenir Doğru cevap
  • Kilit çoğalır

Açıklama: wait() kilidi bırakır ve uyandırılana kadar bekler.

3 wait/notify kavramlarını eşleştir

Kavram Anlamı
wait() Kilidi bırakıp bekler
notify() Bir bekleyeni uyandırır
notifyAll() Tüm bekleyenleri uyandırır
synchronized Kilidi edinir

İleri seviye bölümündeki tüm dersler