Java’da Thread Nedir ve Nasıl Kullanılır?

Java’da concurrency, yani aynı anda birden fazla iÅŸlemi gerçekleÅŸtirme yeteneÄŸi, günümüz yazılım dünyasında performans artırmak ve verimliliÄŸi saÄŸlamak açısından çok önemli hale gelmiÅŸtir. Bu baÄŸlamda, Java’da thread kavramı, çoklu iÅŸ parçacığı kullanımı (multithreading) ve aynı anda birden fazla iÅŸlemi paralel olarak yürütmek için temel yapı taÅŸlarından biridir.

Java’da Thread Nedir?

Bir thread (iÅŸ parçacığı), bir programın bağımsız olarak çalışabilen en küçük birimidir. Java’da bir thread, programın aynı anda birden fazla iÅŸ yapabilmesini saÄŸlar. Bu, özellikle büyük veri kümeleri üzerinde iÅŸlemler yaparken veya uzun süren görevleri yürütürken performans iyileÅŸtirmeleri saÄŸlar. Java’daki her uygulama, JVM (Java Virtual Machine) tarafından oluÅŸturulan ana thread (main thread) ile baÅŸlar ve bu ana thread, programın baÅŸlangıç noktasındaki kodları yürütür.

Java’da thread oluÅŸturmanın iki temel yolu vardır:

  • Thread Sınıfını GeniÅŸletmek (Extending Thread Class)
  • Runnable Arayüzünü Kullanmak (Implementing Runnable Interface)

Bu yöntemlerin her birini detaylı olarak inceleyeceğiz.

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

Java’da thread oluÅŸturmanın ilk yolu, Thread sınıfını geniÅŸleterek yeni bir sınıf yaratmaktır. Bu sınıf içinde, thread’in çalıştıracağı iÅŸlemleri tanımlamak için run() metodunu override etmemiz gerekir. run() metodu, thread’in baÅŸlatılmasıyla beraber yürütülen iÅŸlemleri tanımlar.

class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + " çalışıyor: " + i);
            try {
                Thread.sleep(1000); // 1 saniye bekletir
            } catch (InterruptedException e) {
                System.out.println("Thread kesildi.");
            }
        }
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();

        thread1.start();
        thread2.start();
    }
}

Yukarıdaki örnekte, MyThread sınıfı Thread sınıfını geniÅŸletir ve run() metodunu override ederek thread’in yapacağı iÅŸleri tanımlar. thread1 ve thread2 olarak iki farklı thread baÅŸlattık ve bu thread’ler aynı anda çalışmaktadır. Her biri, run() metodunu 5 kez döngü içinde çalıştırır ve her bir iterasyondan sonra 1 saniye bekletilir.

Runnable Arayüzünü Kullanarak Thread Oluşturma

Java’da thread oluÅŸturmanın diÄŸer bir yöntemi ise Runnable arayüzünü kullanmaktır. Bu yöntem, daha esnek bir çözüm sunar çünkü sınıfınız baÅŸka bir sınıfı da geniÅŸletebilirken aynı anda thread oluÅŸturmanıza olanak tanır.

class MyRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + " çalışıyor: " + i);
            try {
                Thread.sleep(1000); // 1 saniye bekletir
            } catch (InterruptedException e) {
                System.out.println("Thread kesildi.");
            }
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Thread thread1 = new Thread(new MyRunnable());
        Thread thread2 = new Thread(new MyRunnable());

        thread1.start();
        thread2.start();
    }
}

Yukarıdaki örnekte, Runnable arayüzünü implement eden MyRunnable sınıfı oluÅŸturduk. Runnable arayüzü ile run() metodunu override ederek iÅŸlemimizi tanımladık. Thread sınıfının bir örneÄŸi olarak thread1 ve thread2 nesnelerini oluÅŸturduk ve bu thread’leri baÅŸlattık.

Thread.sleep() Kullanımı

Java’da Thread.sleep(long millis) metodu, bir thread’in belirli bir süre beklemesini saÄŸlar. Bu yöntem, belirli iÅŸlemler arasında bir gecikme eklemek istediÄŸimizde kullanışlıdır. Ancak InterruptedException atabileceÄŸi için bu hatayı try-catch bloÄŸu içinde ele almak önemlidir.

ublic class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            for (int i = 1; i <= 3; i++) {
                System.out.println("İşlem " + i);
                try {
                    Thread.sleep(2000); // 2 saniye bekletir
                } catch (InterruptedException e) {
                    System.out.println("Thread kesildi.");
                }
            }
        });

        thread.start();
    }
}

Bu örnekte, lambda ifadesi kullanarak basit bir thread oluÅŸturduk ve her iterasyonda 2 saniye beklemesini saÄŸladık. Bu ÅŸekilde thread’lerin nasıl bekletilebileceÄŸini görebilirsiniz.

Thread Önceliği (Thread Priority)

Java’da thread’lere öncelik atamak mümkündür. setPriority(int priority) metodu ile bir thread’e öncelik verebiliriz. Java’da thread öncelikleri Thread.MIN_PRIORITY (1), Thread.NORM_PRIORITY (5, varsayılan), ve Thread.MAX_PRIORITY (10) arasında bir deÄŸere sahiptir.

public class Main {
    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> System.out.println("Thread 1 çalışıyor"));
        Thread thread2 = new Thread(() -> System.out.println("Thread 2 çalışıyor"));

        thread1.setPriority(Thread.MAX_PRIORITY); // Önceliği 10 olarak ayarlandı
        thread2.setPriority(Thread.MIN_PRIORITY); // Önceliği 1 olarak ayarlandı

        thread1.start();
        thread2.start();
    }
}

Bu örnekte, thread1 maksimum önceliğe sahipken, thread2 minimum önceliğe sahiptir. Ancak, bu öncelikler işletim sistemi tarafından dikkate alınsa da her zaman garantili bir sonuç vermez; dolayısıyla kodun doğru çalışmasına bu önceliklere bağlı olarak güvenmemek önemlidir.

join() Metodu Kullanarak Thread’leri Senkronize Etme

join() metodu, bir thread’in diÄŸerinin bitmesini beklemesini saÄŸlar. Bu, özellikle bir thread’in tamamlanmasını beklemeden diÄŸerine geçilmesini önlemek için kullanılır.

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("Thread 1: " + i);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    System.out.println("Thread kesildi.");
                }
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("Thread 2: " + i);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    System.out.println("Thread kesildi.");
                }
            }
        });

        thread1.start();
        thread1.join(); // thread2 başlamadan önce thread1'in bitmesini bekle
        thread2.start();
    }
}public class Main {
    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("Thread 1: " + i);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    System.out.println("Thread kesildi.");
                }
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("Thread 2: " + i);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    System.out.println("Thread kesildi.");
                }
            }
        });

        thread1.start();
        thread1.join(); // thread2 başlamadan önce thread1'in bitmesini bekle
        thread2.start();
    }
}

Bu örnekte, thread1‘in tamamlanmasını join() metodu ile bekledik ve sonrasında thread2‘yi baÅŸlattık. Bu sayede thread’ler arasında bir sıra oluÅŸturduk.


Java’da thread kullanımı, aynı anda birden fazla iÅŸ gerçekleÅŸtirmeye olanak tanıyan çok güçlü bir araçtır. Bu makalede, thread oluÅŸturmanın iki temel yolunu, thread yönetimini, Thread.sleep(), join(), ve thread önceliklerini detaylıca inceledik. Bu bilgiler, çok iÅŸ parçacıklı programlama konusuna giriÅŸ yapmak isteyen Java geliÅŸtiricileri için önemli bir temel oluÅŸturacaktır.