Merhaba arkadaşlar, bu yazımda JAVA SE konularından biri olan Multithreading konusunu anlatacağım. Bu yazıda Thread nedir? Mantığı nedir? Vb.gibi soruları örneklerle anlamaya çalışacağız.
Java, multithreading bir programlama dilidir, yani Java kullanarak multithreading bir program geliştirebiliriz. Multithreading bir program, eşzamanlı olarak çalışabilen iki veya daha fazla bölüm içerir ve her bölüm bilgisayarımızda birden fazla CPU varsa kullanılabilir.
Thread Nedir?
Bir thread, bir işletim sisteminin işlemciye zaman ayırdığı temel bir işlem birimidir ve birden fazla thread bir process içinde kod yürütebilir. Her Java programında, Java programını yürüten thread olan en az bir thread vardır. Java sınıfının statik main metodunu çağırdığımızda oluşturulur.
Bir thread oluşturmanın iki yolu vardır:
- java.lang.Thread sınıfının extend edilmesi
- java.lang.Runnable interfacenin implement edilmesi
- Bir thread nesnesine sahip olunduğunda, threadi başlatmak için start() metodu çağrılır.
- Bir thread başlatıldığında, run() metodu yürütülür.
- Run() metodu bir exception döndürdüğünde ve attığında, thread ölür.
Her thread’in bir durumu vardır ve bir thread bu altı durumdan birinde olabilir.
- New. Bir threadi’in başlatılmadığ durumdur.
- Runnable. Bir threadin yürütüldüğü durumdur.
- Blocked. Bir threadin bir nesneye erişmek için bir kilit için beklediği durumdur.
- Waiting. Bir threadin bir eylemi gerçekleştirmesi için bir threadin süresiz olarak beklediği bir durum.
- Timed_waiting. Bir threadin bir process gerçekleştirmesi için threadin belirli bir süre boyunca beklediği bir durumdur.
- Terminated. Bir threadin çıktığı bir durumdur.
Bu durumları temsil eden değerler java.lang.Thread.State enum içerisinde saklanır. Bu enum üyeleri aşağıdakilerdir:
- NEW
- RUNNABLE
- BLOCKED
- WAITING
- TIMED_WAITING
- TERMINATED
Thread Yaşam Döngüsü
Bir thread kendi yaşam döngüsünde çeşitli aşamalardan geçer. Örneğin bir thread doğar(born), başlar(started), koşar(run) ve ölür(dies).
Şİmdi yaşam döngüsünü takip ederek metodların tanımını yapalım:
- NEW : Yeni bir thread yaşam döngüsünü yeni durumda başlatır. Program thread başlayana kadar bu durumda kalır. Ayrıca doğmuş bir thread olarak da adlandırılır.
- RUNNABLE : Yeni doğmuş bir thread başladıktan sonra, thread çalıştırılabilir hale gelir. Bu durumda bir thread görevini yerine getirdiği kabul edilir.
- WAITING : Bazen, bir thread bir görevi gerçekleştirmek için thread beklerken, bir thread bekleme durumuna geçer. Bir thread ancak başka bir thread yürütmeye devam etmek için bekleyen thread işaret ettiğinde çalıştırılabilir durumuna geri döner.ü
- Timed Waiting : Çalıştırılabilir(Runnable) bir thread belirli bir zaman aralığı için zamanlanmış bekleme durumuna girebilir. Bu durumdaki bir thread, bu zaman aralığı sona erdiğinde veya beklediği olay gerçekleştiğinde çalıştırılabilir duruma geri döner.
- Termnated(Dead) : Çalıştırılabilir(Runnable) bir thread, görevini tamamladığında yada başka şekilde sona erdiğinde sonlandırılmış duruma girer.
NewThread.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
package com.furkan.thread; public class NewThread implements Runnable { String name; Thread t; public NewThread(String threadname) { name = threadname; t = new Thread(this, name); System.out.println("New thread: " + t); t.start(); } public void run() { try { for (int i = 5; i > 0; i--) { System.out.println(name + ": " + i); Thread.sleep(1000); } } catch (InterruptedException e) { System.out.println(name + "Interrupted"); } System.out.println(name + " exiting."); } } |
Test.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package com.furkan.test; import com.furkan.thread.NewThread; public class Test { public static void main(String[] args) { new NewThread("One"); new NewThread("Two"); new NewThread("Three"); try { Thread.sleep(10000); } catch (InterruptedException e) { System.out.println("Main thread Interrupted"); } System.out.println("Main thread exiting."); } } |
Çıktı:
Bu yazımı burada bitiriyorum arkadaşlar, diğer yazılarımda görüşmek üzere…