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.
Bir yanıt yazın