Java Threading - MultiThreading

Basitçe Thread, bir programın paralel olarak çalışan ve biribirine bağlımlı ya da bağımsız işlemler yapan alt parçacıklarına verilen isimdir.
Bir program içinde birçok thread oluşturulabilmektedir. Örneğin eş zamanlı olarak bir thread'de 1'den 1000000'a kadar sayıları saydırırken, bir yandan 1000000'dan 1'e sayıları büyükten küçüğe saydırabilmekteyiz. Hatayımızda threadler olmasaydı ikincisayma işleminin başlaması için ilkinin bitmesi beklenmek zorundaydı.
 
Thread Oluşturma Şekilleri :
1. İşletim sistemi tarafından oluşturulan thread
2. Kullanıcı tarafından oluşturulan threadler.
3. Hibrit threadler
 
Thread Oluşturma Şekilleri :
1. Çekirdek Uzayında Gerçeklenen Threadler : Thread tablosu kernel’de (işletim sisteminde) yer alır. Hangi thread’in çalışacağına kernel (çekirdek) karar verir. Yeni thread oluşturmak için kernel’da sistem çağrısı yürütülür.
2. Kullanıcı Uzayında Gerçeklenen Threadler : Kernel, threadlerden haberdar değildir, bu nedenle threadleri desteklemeyen işletim sistemlerinde bile kullanıabilir. Her process’in (programın) ayrı thread tabloları bulunmaktadır. Bu sayede her processte farklı iş sıralama algoritmaları kullanılabilmektedir.
3. Hibrit Threadler : Çekirdek ve kullanıcı düzeyinde threadler vardır, ancak kernel sadece kernel düzeyindeki threadlerden haberdardır. Bir kernel düzeyi thread üzerinde birden fazla kullanıcı düzeyi thread sıra ile çalışır.

 

Mutex-Exclusion
Mutex-Exclution kavramı, birden fazla threadin eş zamanlı güvenli çalışmasını sağlamak anlamına gelmektedir. Birden fazla thread eş zamanlı olarak çalışırken çakışmalar gerçekleşebilmektedir. Bunu önleyebilmek için yazılım dilleri bazı kontrollerle bu çakşmayı önlemektedir.
 
Cross-Threading
Multi-Threading uygulamalarında threadlerin birbirleriyle haberleşmesini sağlayan yapıdır. Örneğin eş zamanlı aynı control üzerinde birden fazla thread işlem yapamazken bu yöntem sayesinde bu işlemi gerçekleştirebilmesi sağlanabilmektedir.
 
Bu kadar teorik açıklamadan sonra Thread uygulamalarımıza başlayalım.
 

İlk örneğimiz tek bir thread oluşturma ve kullanma işlemidir.

    public class Hesap extends Thread{
       
        private int sayac = 0;
     
        public void run(){
            while(true){
                System.out.println(this.sayac++);
            }
        }
    }
 

   Hesap sınıfımız Thread sınıfından türetilmiştir. Bu işlem, thread olarak kullanılabileceğini belirtmektedir. Şimdi Hesap sınıfından bir nesne oluşturup projemizi çalıştıralım.

    public static void main(String[] args) throws InterruptedException {
        Hesap hesap1 = new Hesap();
        hesap1.start();
    }
 

Kodumuz sonsuz döngüye girdiği için kodumuzun çalışmasını durdurduk ve durdurduğumuz noktada ekran görüntüsünü aldık.

Java Threading - MultiThreading

Şimdi eş zamanlı çalışan birden fazla thread oluşturma işlemini inceleyelim.

Önceki örneğimizde tek thread oluştururken Thread sınıfını genişletmiştik. Şimdi ise java.lang.Runnable Interface'inin kalıtımını alarak işlem yapıyoruz. Bu yöntem, thread oluşturmak için alternatif bir yöntemdir. Sınıflararası kalıtım verilmesi gereken durumlarda, Java sınıfları tek bir sınıftan kalıtım alacağı için bazen Thread sınıfından kalıtım almak imkansız hale gelebilmektedir. Bu durumlarda Runnable interface'i kurtarıcı olarak imdadımıza yetişmektedir.
 
Örnek uygulamamızda Islem isminde bir sınıfımız olsun ve bu sınıfta sonsuz döngüde alt alta işlem adı ve kaçıncı kez döngüde döndüğü bilgileri gösterilsin.
 
Runnable Interface'inin run methodu asıl işlemimizi yapan methoddur.
 
    public class Islem implements Runnable{
     
        private int sayac = 0;
        private int islemNo;
     
        public Islem(int islemNo){
            this.islemNo = islemNo;
        }
       
        @Override
        public void run() {
            while(true){
                System.out.println("Islem " + this.islemNo + " : " + this.sayac++);
            }
        }
    }
 
 
Eş zamanlı 2 işlem çalıştıracağımız için islemNo değişkeni ile hangi işlemde hangi değerin çalıştığını takip edebiliriz.
 
Şimdi bu kodumuzu denemek için main methoduna gidelim.
 
    public static void main(String[] args) throws Exception {
        Islem islem1 = new Islem(1);
       
        Islem islem2 = new Islem(2);
       
        Thread thread1 = new Thread(islem1);
        Thread thread2 = new Thread(islem2);
     
        thread1.start();
        thread2.start();
    }
 
 

Önceki uygulamamızda Hesap sınıfı Thread'den kalıtım aldığı için run (ya da start) diyerek hemen çalıştırdık. Fakat burada Islem sınıfımızdan oluşturacağımız değişkeni önce Thread olarak tanımlamamız gerekmektedir. Bunun için 2 tane Thread oluşturuyoruz.

Şimdi main methodunu çalıştıralım.

Java Threading - MultiThreading

Kodumuz sonsuz döngüye girdiği için herhangi bir yerinde durdurup ekran çıktısı aldım. Gördüğünüz gibi Islem2 22167'deyken Islem1 25188. döngüde bulunmakta ve belli bir sistem ile çalışmaktadırlar.

Kaynaklar

Yorumunuzu Ekleyin


Yükleniyor...
Yükleniyor...