Java ile Multithreading

Java ile Multithreading

Herkese merhabalar, bu yazımızda sizlere Java programlama dilinde Multithreading yapısından bahsedeceğim. Thread yapısından bahsederek Örnek uygulama geliştireceğiz

Hadi başlayalım

Multithreading nedir ?

Multithreading, işlemcinin daha efektif bir biçimde kullanılabilmesi için bir programın farklı işlemlerinin ayrı ayrı işlem parçacıklarında yapılmasına denir. İşlem parçacıkları thread olarak adlandırılır. Threadlar bir ana işlemin içeirsinde çalışan ve processlere göre daha az kaynak tüketerek asenkron olarak çalışan yapılardır.

Java programlama dilinde multithreading yapısı:
  • Bir sınıfı türetirken Thread sınıfından kalıtım alınarak
  • Runnable arayüzünü ilgili sınıfa implement ederek sağlanabilir.

Şimdi bu yapıları inceleyelim.

Thread sınıfından kalıtım alınarak Nasıl thread türetilir:

Bir sınıf oluşturulur ve bu sınıf Thread sınıfından kalıtım alır. Thread sınıfında virtual olarak tanımlanan run() metodu bulunmaktadır. run() metodu bir threadın başlangıç metodudur. Bizde işlemlerimizi yapabilmek için run() metodunu yeniden tanımlarız ve yapacağımız işlemleri burada tanımlarız.
Bu ilgili sınıf start() edildiğinde run() metodu otomatik olarak çağrılır ve thread arka planda işlemlerine başlar.

Aşağıda Thread sınıfından türetilen bir Thread sınıfının nasıl oluşturulduğunu be başlatıldığını görmektesiniz.


public class JavaMultithreading {
    
    public static void main(String[] args) {
        new TheCounterWithThread(33).start();
    }
    
}

class TheCounterWithThreadextends Thread{
    
    int counter = 0;
    
    public TheCounterWithThread(int startFrom){
        this.counter = startFrom;
    }
    
    public void run(){
        while(true){
            counter++;
            System.out.println(counter);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(TheCounterWithThread.class.getName())
                        .log(Level.SEVERE, null, ex);
            }
        }
    
    }
}
Program çıktısı aşağıdaki gibi olacaktır

34
35
36
37
38
39
40
41
42
...
şeklinde devam edecektir.

Şimdi birde Runnable interface ile Multithreading işleminin nasıl yapıldığına bakalım

Runnable arayüzünü kullanmak için bir sınıf oluşturulur ve bu sınıfı Runnable arayüzü implements edilir. Bu sayede run() sınıfı override edilebilmiş olunur. İlgili metod doldurulur ve start metodu ile bu sınıf çağrıldığında arka plan thread otomatik olarak run() metodu ile başlatılmış olur.

Aşağıda Runnable arayüzü ile bir sınıfın kullanımı görülmektedir.


public class JavaMultithreading {
    
    public static void main(String[] args) {
        new TheCounterWithRunnable(33).run();
    }
    
}

class TheCounterWithRunnable implements Runnable{
    
     int counter = 0;
    
    public TheCounterWithRunnable(int startFrom){
        this.counter = startFrom;
    }

    @Override
    public void run() {
        while(true){
            counter++;
            System.out.println(counter);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(TheCounterWithRunnable.class.getName())
                        .log(Level.SEVERE, null, ex);
            }
        }
    }
}
Program çıktısı aşağıdaki gibi olacaktır

34
35
36
37
38
39
40
41
şeklinde devam edecektir.

Şimdi son olarak birden fazla threadi aynı paralel olarak çalıştırma örneğini inceleyelim.


public class JavaMultithreading {
    
    public static void main(String[] args) {
        String[] arr = { "Burak" ,"Hamdi" ,"TUFAN" ,"The" ,"Code" ,"Program" };
        for(int i=0; i<arr.length; i++){
            new TheMultiCounter(arr[i]).start();
        }
    }
    
}

class TheMultiCounter extends Thread{
    
    int counter = 0;
    String threadName = "";
    
    public TheMultiCounter(String threadName){
        this.threadName = "Thread " + threadName;
    }
    
    public void run(){
        while(true){
            counter++;
            System.out.println(threadName + " : " +counter);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(TheCounterWithThread.class.getName())
                        .log(Level.SEVERE, null, ex);
            }
        }
    
    }
}
Program çıktısı aşağıdaki gibi olacaktır

Thread Burak : 1
Thread Hamdi : 1
Thread Code : 1
Thread TUFAN : 1
Thread The : 1
Thread Program : 1
Thread Program : 2
Thread The : 2
Thread TUFAN : 2
Thread Hamdi : 2
Thread Burak : 2
Thread Code : 2
Thread Program : 3
Thread The : 3
Thread Hamdi : 3
Şeklinde devam edecektir
Buraya kadar Multithreading için yapılabilecek iki yöntemide denemiş olduk. Şimdi birazda farklarından bahsedelim.
  • Eğer sınıfımızı multithreading için Thread sınıfından türetirsek, başka bir sınıftan kalıtım alamayız. Çünkü Java programlama dili çoklu kalıtım almayı desteklememektedir. Ama runnable arayüzünü implemente edersek başka bir sınıftan kalıtım alabiliriz.
  • Runnable arayüzü Thread sınıfının sahip olduğu bazı metodlara sahip değildir. Dolayısıyla Runnable arayüzünü implemente edersek bu ilgili metodları kullanamayacağız.

Bu yazımızda buraya kadar.

Kaynak kodlara Github üzerinden aşağıdaki link aacılığı ile ulaşabilirsiniz.
https://github.com/thecodeprogram/TheSingleFiles/blob/master/JavaMultithreading.java

Burak Hamdi TUFAN


Tags


Share this Post

Send with Whatsapp

Post a Comment

Success! Your comment sent to post. It will be showed after confirmation.
Error! There was an error sending your comment.

Comments

  • There is no comment. Be the owner of first comment...