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();
    }

}

Okumaya devam et

Java’da Multithreading – Bölüm 5: Thread Havuzları (Thread Pools)

Diyelim ki x tane görevimiz olsun ve mesela bu görevleri y’li threadler halinde yerine getirmek isteyelim. Java’da bunu nasıl gerçekleştirirdik? Java’nın bu ihtiyaca karşılığı thread havuzlarıdır, yani İngilizce tabiriyle Thread Pools.

Örneğin aşağıdaki gibi bir Processor sınıfımız olsun. “run()” metodu daha önce öğrendiğimiz üzere kendisini işletecek threadin yerine getireceği görevi ifade ediyor:

class Processor implements Runnable {

    private int id;

    public Processor(int id) {
        this.id = id;
    }

    @Override
    public void run() {
        System.out.println("Başlıyor: " + id);

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

        System.out.println("Tamamlandı: " + id);
    }

}

Okumaya devam et