wait ve notify
- Java kursu
- İleri seviye
- Ders 59/82
- 5 dk
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
// 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
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
synchronized (lock) {
while (!ready) lock.____();
}
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 |