Java ile Multithreading İşlemleri-3 (Semaphore)

Merhaba arkadaşlar, bugün sizinle Java’da semaphore kullanımını işleyeceğiz. Malumunuz tüm threadler eş zamanlı olarak çalışır ve java bunlardan ilk oluşturulanın ilk çalıştırılacağının garantisini vermez. Örnek verecek olursak biz Thread 1’in start() methodunu daha erken çağırmamıza rağmen Thread 2 daha önce çalışmaya başlayabilir. Bu tarz durumlar bazen can sıkıcı olabilir. Bugün sizinle aynı işlemi önce normal olarak sonra da semaphore kullanarak yapacağız ve farkları gözlemleyeceğiz.

ilk önce aşağıdaki kodu çalıştıralım. Gördüğünüz gibi çalıştırıldığı zaman yapıcı method’da geçtiğimiz ideyi konsola yazan bir thread oluşturduk ve bu şekilde hangi thread’in daha önce çalışmış olduğunu anladık.

public class Main
{
    public static void main(String[] args)
    {
        for(int i = 0; i < 3; i++)
        {
            StandardThread thread = new StandardThread(i);
            thread.start();
        }
    }
}

class StandardThread extends Thread
{
    int id;
    public StandardThread(int id)
    {
        this.id = id;
    }
    public void run()
    {
        System.out.println(id);
    }
}

Sonuç

0
2
1

Gördüğünüz gibi 1 numaralı thread’in start() methodu 2 numaralı threadinkinden önce çağrılmasına rağmen Thread 2 daha erken çalıştı. Bu durum sıralamanın önde olduğu programlarda soruna neden olabilir. Şimdi bu sorunu Semaphore kullanarak çözeceğiz.

import java.util.concurrent.Semaphore;

public class Main
{
    public static void main(String[] args)
    {
        Semaphore semaphore = new Semaphore(1);

        for(int i = 0; i < 3; i++)
        {
            new SemaphoreThread(semaphore,i).start();
        }
    }
}

class SemaphoreThread extends Thread
{
    Semaphore semaphore;
    int id;
    public SemaphoreThread(Semaphore semaphore,int id)
    {
        this.semaphore = semaphore;
        this.id = id;
    }

    public void run()
    {
        try
        {
            semaphore.acquire();
            System.out.println(id);
        }
        catch (Exception ex)
        {

        }
        finally {
            semaphore.release();
        }
    }
}

Sonuç

0
1
2

Gördüğünüz gibi sonuçları gayet düzgün bir sırayla aldık. Şimdi size sırayla adımları anlatacağım. İlk adımda Main thread içerisinde Semaphore tipinden bir nesne oluşturduk. Bu nesneye 1 parametresini verdik. Bu bir semaphore’u serbest bırakmadan yani release() methodunu çağırmadan maksimum kaç threadin çalıştırılabileceğinin iznidir. Örneğin ona 2 yazarsak release etmeden 3.thread çalışmaz. Biz ona bir değeri verdik. Thread çalışır çalışmaz acquire() methodunu çağırarak semaphore’u başlattık ve çalışmasını istediğimiz kodu yazdık. işlem sonunda da release() methodunu çağırarak semaphore’u serbest bıraktık.

Leave a Reply

Your email address will not be published. Required fields are marked *