Java
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.
Örnek çözümü göster
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");
}
}
Kendini test et
-
wait çağrısını tamamla
synchronized (lock) {
while (!ready) lock.____();
}
Cevabı göster
synchronized (lock) {
while (!ready) lock.wait();
}
-
wait() çağrıldığında kilit ne olur?
- Kilit kalır, bekler
- Kilit yok edilir
- Kilit bırakılır ve beklenir
- Kilit çoğalır
Cevabı göster
Kilit bırakılır ve beklenir — wait() kilidi bırakır ve uyandırılana kadar bekler.
-
wait/notify kavramlarını eşleştir
- wait()
- Kilidi bırakıp bekler
- notify()
- Bir bekleyeni uyandırır
- notifyAll()
- Tüm bekleyenleri uyandırır
- synchronized
- Kilidi edinir
Sıradaki ders: Özet - Multithreading