Java’da Multithreading – Bölüm 8: Beklet ve Bildir (Wait and Notify)

Bir önceki bölümde Producer-Consumer yapısını ve bir kuyruk ile nasıl gerçekleştirebileceğimizi incelemiştik. Kuyruğa eleman eklerken veya kuyruktan eleman alırken bazı koşullara göre ilgili threadlerin bekletildiğinden söz etmiştik. Bu bölümde bu işlevselliği kendi çok threadli programlarımız için nasıl gerçekleştirebileceğimizi öğreneceğiz.

Java’da her sınıf otomatik olarak “Object” sınıfından türer. “Object” üst sınıfına ait “wait()” ve “notify()” metotları yukarıda bahsettiğimiz bekleme ve tekrar sürdürme işlevselliğini sağlayabilmek için kullanılırlar. Bu bölümde “wait()” ve “notify()” metotlarının ne işe yaradıklarına ve nasıl kullanıldıklarına basit bir örnekle giriş yapmış olacağız.

Üretici ve tüketici metotlara yani “produce()” ve “consume()” metotlarına sahip Processor sınıfımız aşağıdaki gibi olsun:

public class Processor {

    public void produce() throws InterruptedException {
        synchronized (this) {
            System.out.println("Üretici thread çalışıyor...");
            wait();
            System.out.println("Üretici devam ediyor...");
        }
    }

    public void consume() throws InterruptedException {
        Thread.sleep(2000);

        Scanner scanner = new Scanner(System.in);

        synchronized (this) {
            System.out.println("Tüketici thread çalışıyor...");
            System.out.print("Devam etmek için 'Enter'a basınız: ");
            scanner.nextLine();
            System.out.println("Tüketici devam ediyor...");
            notify();
            Thread.sleep(5000);
            System.out.println("Tüketici 5 saniye daha devam etti.");
        }
    }

}

Okumaya devam et