Thread de join methodu, bir thread işlemini bitirmeden diğer bir thread çalışması engellenir. Eşzamanlı birden fazla thread in iş yapması önlenmiş olur.
4 tane thread olsun, burada 1.thread çalıştıktan sonra, thread1.join() yaparak 1.thread bitmeden 2.thread e geçmeyecektir. 1. Thread çalışması bitince 2. thread çalışır ve biter. Sonra 3. başlar ama daha 3. thread bitmeden hemen 4. thread de peşine başlar beklemeden. Bu thread güvenliğini sağlıksız olmasına neden olabilir.
Kod örneği:
Thread thread1 = new Thread(runnableThread, "Thread 1");
Thread thread2 = new Thread(runnableThread, "Thread 2");
Thread thread3 = new Thread(runnableThread, "Thread 3");
Thread thread4 = new Thread(runnableThread, "Thread 4");
thread1.start();
thread1.join();
thread2.start();
thread2.join();
thread3.start();
thread4.start();
public class RunnableThread implements Runnable {
public void run() {
Thread thread = Thread.currentThread();
System.out.println(thread.getName() + " başladı");
try {
Thread.sleep(1000);
System.out.println(thread.getName() + " bitti.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Çıktısı:
Thread 1 başladı
Thread 1 bitti.
Thread 2 başladı
Thread 2 bitti.
Thread 3 başladı
Thread 4 başladı
Thread 4 bitti.
Thread 3 bitti
-------- ya da şu sonucu da alabilirsiniz ----- thread 3 ve 4 e dikkat!!
Thread 1 başladı
Thread 1 bitti.
Thread 2 başladı
Thread 2 bitti.
Thread 4 başladı
Thread 3 başladı
Thread 3 bitti.
Thread 4 bitti.
Bu thread çalışmasını günlük hayatımıza indirgeyemek için basit bir örnek vermeye çalışayım.
Çamaşır makinesini düşünün, BAŞLA derseniz makine su alıp, sırası ile deterjan, çamaşır suyu vs. maddeleri alıp yıkar ve en son kurutup işlemi bitirir.
Buradaki örnek aslında her bir süreci birer Thread olarak düşünün ayrı birer işlem. Bu işlemler paralel olarak da yapılabilir , peş peşe biri bitince diğerine geç şeklinde de.
Çamaşır yıkarken, henüz suyu alma komutu gelmiş ve almaya da devem ederken, hemen peşine çalışıp kurutma aşaması hemen bitseydi nasıl olurdu :((
Bunu engellemenin yolu,
Thread 1 -->"Suyu Al" diye bir komut olsun,
Thread 2 -->"Kurutmaya Geç" diğer bir komut olsun.
--------------------------------------------------
Thread 1.start(); ile Suyu alacağız.
Thread 1.join(); diyerek su alımına başlayan işlem bitmeden kesinlikle diğer işleme geçilemeyecektir.
Thread 2.start(); ile de kurutmaya başlayacağız.
--------------------------------------------------