Java’da Multithreading – Bölüm 6: Geri Sayım İçin CountDownLatch Yardımcı Sınıfı

Java’nın dahili kütüphanelerinde “multithreading” programlamaya dair pek çok yardımcı sınıf mevcuttur. (java.util.concurrent.*) Bunlardan biri de bu bölümde ele alacağımız “CountDownLatch” sınıfıdır. “Count down” “geri sayım”, “latch” “kapı sürgüsü/kilit mandalı” manalarına gelmektedir.

Geri sayım tamamlanıncaya kadar CountDownLatch örneğinin “await()” metodunu çağıran tüm threadler bekletilir. Geri sayım tamamlandığında bir anlamda kapı sürgüsü açılır ve bekleyen threadler işlemeye devam eder. Örneğin “n” sayıda threadin işlerini bitirdiklerini bildirene kadar (yani her biri sayacı bir azaltana ve nihayetinde sayacın değeri sıfıra ulaşana kadar) ana threadin bekletilmesi istediğimiz bir durumda kullanılabilir:

public class Application {

    public static void main(String[] args) {
        CountDownLatch latch = new CountDownLatch(3);

        ExecutorService executorService = Executors.newFixedThreadPool(3);

        for (int i = 0; i < 3; i++) {
            executorService.submit(new Thread(new Processor(latch)));
        }

        try {
            latch.await();
        } catch (InterruptedException e) {
        }

        System.out.println("Program bitti.");
    }

}

class Processor implements Runnable {

    private CountDownLatch latch;

    public Processor(CountDownLatch latch) {
        this.latch = latch;
    }

    @Override
    public void run() {
        System.out.println("Thread başladı.");

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
        }

        latch.countDown();
    }

}

Örneğimiz oldukça basit. 3’ten (n) geriye sayacağımız için CountDownLatch kurucusuna 3’ü geçtik. Önceki bölümde gördüğümüze benzer şekilde 3 threadlik bir havuz oluşturup 3 adet thread ekledik. Threadlerimize Runnable örneği olarak birer Processor örneği geçtik. Threadlerin her biri işini bitirdikten sonra (yani 5 saniye bekledikten sonra) CountDownLatch örneğinin “countDown()” metodunu çağırarak sayacı bir azaltacaklar. CountDownLatch halihazırda “thread-safe” olduğu için, önceki bölümlerde gördüğümüz gibi senkronizasyon için ayrıca bir çaba sarf etmemiz gerekmez.

Örneğimizde “CountDownLatch” örneğinin “await()” metodu yalnızca ana thread tarafından çağrılıyor. Ana thread her bir thread işini bitirip sayacı bir azaltana, yani sayaç sıfıra ulaşıncaya kadar bekletilir, sayaç sıfırlandığındaysa çalışmasına devam eder, ve “Program bitti.” yazdırılır. Programı çalıştırdığınızda, Thread.sleep(5000) çağrısı sayesinde bu durumu siz de rahatlıkla gözlemleyebilirsiniz. Programın çıktısı aşağıdaki şekilde olacaktır:

Thread başladı.
Thread başladı.
Thread başladı.
Program bitti.

Son olarak belirtilmesi gereken önemli bir nokta; CountDownLatch yeniden kullanılabilir (reusable) değildir. Bir diğer deyişle sayacı bir kere sıfıra ulaştığında bir daha kullanılamaz. Yeniden bir sayma işlemine ihtiyaç duyduğumuzda yeni bir CountDownLatch örneği oluşturmamız gerekir.

Reklamlar

Bir Yorum Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s