Kod Sörfü

Dalgalan her satırda, keşfet sonsuz kod okyanusunu.

Java’da Multithreading Nedir?

Java’da Multithreading Nedir?

Multithreading, bir programın birden fazla iş parçacığını (thread) eş zamanlı olarak çalıştırabilmesini sağlar. Bu iş parçacıkları, işletim sistemi tarafından planlanır ve CPU’nun çekirdeklerinde paralel olarak çalışabilir. Böylece, birden çok işlemi aynı anda yaparak uygulamaların performansını ve yanıt süresini önemli ölçüde iyileştirebilir.

Multithreading’in Avantajları

  • Yüksek Performans: Birden fazla iş parçacığı, farklı görevleri paralel olarak gerçekleştirebilir, bu da uygulamanın daha hızlı çalışmasını sağlar.
  • Kaynakların Daha İyi Kullanılması: Bekleme süreleri (örneğin, giriş/çıkış işlemleri) sırasında işlemci, diğer iş parçacıklarına geçebilir ve böylece kaynakları daha verimli kullanabilir.
  • Daha İyi Kullanıcı Deneyimi: Grafiksel kullanıcı arayüzü (GUI) gibi uygulamalar, arayüzü donmadan arka planda işlemler yapabilir.

Java’da Thread Oluşturma

Java’da thread oluşturmanın iki temel yolu vardır: Thread sınıfını genişleterek veya Runnable arayüzünü uygulayarak.

Thread Sınıfını Genişleterek

class MyThread extends Thread {
    public void run() {
        for(int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getId() + " Değer: " + i);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        t1.start();
        MyThread t2 = new MyThread();
        t2.start();
    }
}

Bu örnekte, MyThread sınıfı Thread sınıfından türetilmiştir ve run metodunu override ederek iş parçacığının yapacağı işi tanımlamıştır. start() metodu çağrıldığında, Java işletim sistemi tarafından bir iş parçacığı oluşturur ve run metodunu çalıştırır.

Runnable Arayüzünü Uygulayarak

class MyRunnable implements Runnable {
    public void run() {
        for(int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getId() + " Değer: " + i);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Thread t1 = new Thread(new MyRunnable());
        t1.start();
        Thread t2 = new Thread(new MyRunnable());
        t2.start();
    }
}

Bu örnekte, MyRunnable sınıfı Runnable arayüzünü uygular ve run metodunu tanımlar. Thread sınıfının bir nesnesi oluşturulurken Runnable nesnesi argüman olarak verilir. Bu yaklaşım, Java’nın çoklu kalıtımı desteklememesi durumunda tercih edilir.

Synchronisation ve Deadlock

Multithreading kullanırken dikkat edilmesi gereken önemli konulardan biri, kaynakların paylaşımıdır. Birden fazla thread, aynı kaynağa erişmeye çalıştığında, veri tutarsızlığı gibi sorunlar yaşanabilir. Bu sorunları önlemek için synchronized anahtar kelimesi kullanılır.

public class Counter {
    private int count = 0;
    public synchronized void increment() {
        count++;
    }
    public int getCount() {
        return count;
    }
}

Bu örnekte, increment metodu synchronized olarak işaretlenmiştir, bu da aynı anda yalnızca bir thread’in bu metodu çalıştırabileceği anlamına gelir.

Ancak, yanlış senkronizasyon kullanımı, deadlocks (çıkmaz durumlar) gibi sorunlara yol açabilir. Deadlock, iki veya daha fazla thread’in birbirini sonsuza dek beklemesi durumudur ve bu durumdan kaçınmak için dikkatli tasarım ve planlama gereklidir.

Sonuç

Java’da multithreading, uygulamaların performansını önemli ölçüde artırabilir, ancak doğru şekilde kullanılmazsa karmaşık hata durumlarına yol açabilir. Bu yazıda multithreading temelleri, thread oluşturma yöntemleri, senkronizasyon ve deadlock’lardan kaçınma gibi konuları ele aldık. Uygulamalarınızda multithreading kullanırken, kaynak paylaşımı ve thread yönetimi konularına özellikle dikkat etmeniz önemlidir.

Mehmet Alp avatarı

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Mehmet Alp Albayraktaroğlu

LinkedIn’de benimle iletişime geçmekten çekinmeyin veya bana bir e-posta gönderin—teknolojiyle ilgili her şeyi konuşmaktan mutluluk duyarım! 🚀👩‍💻