🧵 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
InterruptedExceptionfı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 Durumu | Bekleme sırasında başka thread keserse InterruptedException oluşur. |
| Zamanlama Garantisizdir | join(millis) süresi işletim sistemi zamanlayıcısına bağlıdır. |
| Sonsuz Bekleme | Parametresiz join() thread bitene kadar bekler. |
| Verimlilik | join CPU döngülerini boşa harcamaz, sadece bekler. |
| Alternatifler | ExecutorService, Future.get() veya CountDownLatch daha gelişmiş çözümlerdir. |
❓ Sıkça Sorulan Sorular (SSS)
- 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.
- join(long millis) neden tam süreyi beklemez?
Thread zamanlaması işletim sistemi tarafından belirlenir. Java sadece bekleme isteğini iletir.
- InterruptedException ne zaman oluşur?
Bekleme sırasında thread başka bir thread tarafından kesilirse (interrupt() çağrılırsa).
- Birden fazla thread'i nasıl bekleyebilirim?
Her biri için ayrı ayrı join() çağırın veya CountDownLatch kullanın.
- 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.