Java’da Multithreading: Eşzamanlı Programlamaya Giriş
Java’da Multithreading: Eşzamanlı Programlamaya Giriş
Günümüzde modern uygulamaların çoğu, birden fazla işlemci çekirdeğini verimli bir şekilde kullanmak ve işlem hızını artırmak için multithreading (çoklu iş parcacığı) yapısına dayanır. Java, Thread sınıfı ve Runnable arabirimi sayesinde kolayca multithreading işlemleri gerçekleştirmenizi sağlar.
Bu makalede, Java’da multithreading kavramını ve temel kullanımlarını örneklerle inceleyeceğiz.
1. Multithreading Nedir?
Multithreading, bir programın birden fazla iş parçacığı (thread) kullanarak aynı anda birden fazla iş yapmasını sağlayan bir tekniktir. Her thread, bağımsız bir iş akışına sahiptir ve farklı işleri eşzamanlı olarak yürütebilir.
Multithreading’in başlıca avantajları:
- Daha iyi performans: CPU’nun tam kapasite kullanılmasını sağlar.
- Hızlı tepki verme: Uzun süreli işlemler yapılırken arayüz donmaz.
- Kaynak paylaşımı: Aynı program içinde paylaşılan bellek kaynakları kullanılabilir.
2. Java’da Thread Oluşturma
Java’da Thread sınıfını miras alarak veya Runnable arabirimini uygulayarak iki farklı şekilde thread oluşturabilirsiniz.
Yöntem 1: Thread Sınıfını Miras Alarak
class MyThread extends Thread {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + ” – ” + i);
try {
Thread.sleep(1000); // 1 saniye beklet
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}public class ThreadExample {
public static void main(String[] args) {
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();t1.start();
t2.start();
}
}
Yöntem 2: Runnable Arabirimini Uygulayarak
class MyRunnable implements Runnable {
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + ” – ” + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}public class RunnableExample {
public static void main(String[] args) {
Thread t1 = new Thread(new MyRunnable());
Thread t2 = new Thread(new MyRunnable());t1.start();
t2.start();
}
}
Her iki kod da aynı anda iki farklı thread oluşturur ve 1 saniyelik aralıklarla ekrana sayı basar.
3. Thread Senkronizasyonu
Multithreading kullanırken farklı thread’lerin aynı kaynağa erişim sırasında veri tutarsızlığı oluşturmaması için senkronizasyon kullanılmalıdır.
Senkronizasyon Kullanımı
class Counter {
private int count = 0;public synchronized void increment() {
count++;
}public int getCount() {
return count;
}
}public class SynchronizedExample {
public static void main(String[] args) throws InterruptedException {
Counter counter = new Counter();Thread t1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) counter.increment();
});Thread t2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) counter.increment();
});t1.start();
t2.start();t1.join();
t2.join();System.out.println(“Final Count: ” + counter.getCount());
}
}
Bu örnekte synchronized anahtar kelimesi ile increment() metodu senkronize edilmiştir. Böylece farklı thread’lerin aynı anda sayacı değiştirmesi engellenmiştir.
4. Thread Pool Kullanımı
Birden fazla thread oluşturmak yerine ExecutorService kullanarak thread havuzu (thread pool) oluşturabilirsiniz.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;class WorkerThread implements Runnable {
private int taskId;public WorkerThread(int id) {
this.taskId = id;
}public void run() {
System.out.println(“Task ” + taskId + ” is running on ” + Thread.currentThread().getName());
}
}public class ThreadPoolExample {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(3);for (int i = 1; i <= 5; i++) {
executor.execute(new WorkerThread(i));
}executor.shutdown();
}
}
Bu kod parçası, 3 thread’ten oluşan bir havuz oluşturur ve 5 işi bu thread’lere bölerek yürütür.
Sonuç
Java’da multithreading, uygulamalarınızın performansını artırmak için oldukça gücü bir tekniktir. Thread sınıfı, Runnable arabirimi, senkronizasyon, ve ThreadPool gibi yapılar sayesinde, Java uygulamalarınızı daha verimli hale getirebilirsiniz.
Uygulamalarınızda veri tutarlılığı, senkronizasyon, ve thread yönetimi gibi konulara dikkat etmeniz önemlidir.