Skip to main content

🧵 Java Thread Join Kullanımı: İş Parçacıklarının Senkronizasyonu


🧠 Bu Rehberde Ne Öğreneceksiniz?

Bu rehberde, Java’daki Thread.join() metodunun nasıl çalıştığını öğreneceksiniz.
Amaç, bir thread’in diğerinin bitmesini beklemesini sağlayarak yürütme sırasını kontrol etmektir.
Üç farklı join() sürümünün (parametresiz, millis, millis+nanos) farklarını örnek kodla göreceksiniz.


🧩 1. Thread.join() Nedir?

Thread.join() metodu, mevcut thread’in (örneğin main) belirli bir thread tamamlanana kadar beklemesini sağlar.
Bu sayede sıralı, senkron ve kontrollü bir çalışma akışı elde edilir.

🔸 join() Metotlarının Türleri

💡 Metot🧾 Açıklama
join()Thread tamamen bitene kadar bekler.
join(long millis)Thread’in bitmesini veya verilen süre dolana kadar bekler.
join(long millis, int nanos)Belirtilen milisaniye + nanosaniye süresince bekler.

💬 Not: Bekleme sırasında kesilme olursa InterruptedException fırlatılır.


⚙️ 2. Adım Adım join() Kullanımı

Aşağıdaki örnek, üç thread’in sırayla ve kontrollü şekilde çalışmasını sağlar.

package com.rabisu.threads;

class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Thread başladı: " + Thread.currentThread().getName());
try {
Thread.sleep(4000); // Thread 4 saniye uyur
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread bitti: " + Thread.currentThread().getName());
}
}

public class ThreadJoinExample {

public static void main(String[] args) {
Thread t1 = new Thread(new MyRunnable(), "tr1-islem");
Thread t2 = new Thread(new MyRunnable(), "tr2-islem");
Thread t3 = new Thread(new MyRunnable(), "tr3-islem");

t1.start();

// t1'in bitmesini 2 saniye bekle, ardından t2'yi başlat
try {
t1.join(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}

t2.start();

// t1 tamamen bitmeden t3 başlamasın
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

t3.start();

// Ana thread, tüm işlemler bitene kadar bekler
try {
t1.join();
t2.join();
t3.join();
} catch (InterruptedException e) {
e.printStackTrace();
}

System.out.println("Tüm thread'ler tamamlandı, main thread sonlanıyor.");
}
}

➡️ Bu örnek, ana thread’in diğerlerini bekleyerek düzenli bir yürütme sağlamasını gösterir.


🧮 3. Örnek Çıktı


Thread başladı: tr1-islem
Thread başladı: tr2-islem
Thread bitti: tr1-islem
Thread başladı: tr3-islem
Thread bitti: tr2-islem
Thread bitti: tr3-islem

Tüm thread'ler tamamlandı, main thread sonlanıyor. 📌 Burada tr3, tr1 tamamlanmadan başlamıyor. Bu sayede thread’ler sıralı biçimde çalışıyor — senkronizasyon sağlanıyor.


⚡ 4. join() Kullanımında Bilmeniz Gerekenler

💡 Durum🧾 Açıklama
Kesilme DurumuBekleme sırasında başka thread keserse InterruptedException oluşur.
Zamanlama Garantisizdirjoin(millis) süresi işletim sistemi zamanlayıcısına bağlıdır.
Sonsuz BeklemeParametresiz join() thread bitene kadar bekler.
Verimlilikjoin CPU döngülerini boşa harcamaz, sadece bekler.
AlternatiflerExecutorService, Future.get() veya CountDownLatch daha gelişmiş çözümlerdir.

❓ Sıkça Sorulan Sorular (SSS)

  1. join() metodu performansı düşürür mü?

Hayır. join(), thread’i uyutmaz; sadece bekletir (blocked state). CPU kullanımı düşer, kaynak israfı olmaz.

  1. join(long millis) neden tam süreyi beklemez?

Thread zamanlaması işletim sistemi tarafından belirlenir. Java sadece bekleme isteğini iletir.

  1. InterruptedException ne zaman oluşur?

Bekleme sırasında thread başka bir thread tarafından kesilirse (interrupt() çağrılırsa).

  1. Birden fazla thread'i nasıl bekleyebilirim?

Her biri için ayrı ayrı join() çağırın veya CountDownLatch kullanın.

  1. sleep() yerine join() kullanmanın farkı nedir?

sleep() sadece zaman kazandırır, join() ise hedef thread’in gerçekten bitmesini bekler.


🎯 Sonuç

Bu rehberde, Java’daki Thread.join() metodunun iş parçacıklarını senkronize etmek için nasıl kullanıldığını öğrendiniz. Thread sıralaması, özellikle paralel işlemlerde düzenli sonuç almak için kritik öneme sahiptir.

💬 Çoklu iş parçacığı kullanan uygulamalarınızı Rabisu Bulut platformunda yüksek performanslı sanal sunucular üzerinde test edebilir, gerçek zamanlı senkronizasyon farkını deneyimleyebilirsiniz.