Java'da Threadlerin Çalışması Esnasındaki Durumları

Java'da Threadlerin Çalışması Esnasındaki Durumları

Herkese merhabalar, Bu yazımızda sizlerle Java programlama dilinde oluşturulan işlem parçacıklarının (Thread) yaşam döngüeri ve bu esnadaki durumları hakkında konuşacağız.

Hadi başlayalım

Aşağıda bir threadın yaşam döngüsü (lifecycle) boyunca bulunabileceği durumlar verilmiştir.

  • New : Bir thread oluşturulmuştur fakat hala start edilmemiştir. oluşturulduktan sonra hazırda beklemektedir.
  • Runnable : Bir thread çalışmaya hazırdır. Burada start komutu verilmiş olabilir ve Runnable durumunda threadın çalışması Thread schedulerin sorumluluğundadır. Threadlar arasındaki geçişlerde threadların beklemesi durumu buna örnektir.
  • Blocked/Waiting : Bir threadın birşeyler beklediği ve işlem yapmadığı durumdur. Bu durumdaki threadlar CPU zamanı harcamazlar.Bu threadların kontrolü yine Thread Scheduler tarafından kontrol edilir. Bu threadlar Runnable konumuna alınmadığı sürece çalışmazlar. Bekledikleri bilgi geldiğinde Runnable konumuna geçerler ve çalışmaya devam ederler.
  • Timed Waiting : Bir threada, çalışması esnasında belirli bir süre bekletilmek adına timeout komutu gönderilir. Thread ise bu süre içerisinde işlem yapmaz ve bekler. Bu süre dolduğunda veya bir otification aldığında bu durumdan çıkar ve tekrar Runnable konumuna dönerek çalışmasına devam eder.
  • Terminated State : Bir threadın işlemini tamamlaması olayıdır. Bu normal bir şekilde görevini bitirmesiyle veya Thread scheduler tarafından zorla kapatılmasıyla olabilir. Ayrıca çalışması esnasında bir hata alınması durumundada Terminated durumuna geçer.

Burada ek olarak bahsetmek istediğim bir konu daha var :
Bir thread başka bir threadın kullandığı bir alana erişmeye çalışıyorsa ve kullanmaya izni yoksa, blocked durumuna geçer. Fakat bir thread başka bir threadın görevini tamamlayarak bir değer göndermesini bekliyorsa waiting durumuna geçer. Blocked ve waiting durumları arasındaki küçük fark budur.

Below image you can see the schematic of States of Lifecycle of a Thread Schematic of states of Thread in lifecycle in Java

Java ile bir Threadın hangi durumda olduğunu nasıl alabiliriz?

Bir threadin anlık durumunu alabilmek için java'da Thread sınıfı içerisinde State adında bir ENUM bulunur. Thread içerisindeki getState() metodu ile Thread bizlere anlık geçerli olan durumu belirten değeri State ENUM yapısının içeirsinden getirir. Aşağıdaki tabloda dönebilecek değerler ve bunların tanımlamaları verilmiştir.

Durum Tanımlama Açıklama
NEW Thread.State.NEW İlgili thread daha başlatılmamıştır.
RUNNABLE Thread.State.RUNNABLE İlgili thread normal şekilde çalışmaktadır.
BLOCKED Thread.State.BLOCKED İlgili thread çalışması başka bir etken tarafından durdurulmuştur.
WAITING Thread.State.WAITING İlgili thread başka bir threaddan veri beklemektedir.
TIMED_WAITING Thread.State.TIMED_WAITING İlgili thread belirli bir süreliğine bekletilmektedir.
TERMINATED Thread.State.TERMINATED İlgili Thread durdurulmuştur ve tekrar başlamayacaktır.

Şimdi thread durumları ile ilgili bi örnek yapalım.


public class ThreadStates {
    
    public static void main(String[] args) {
        TheThread th = new TheThread();
        System.out.println("1 - Thread State : " + th.getState());
        
        th.start();
        System.out.println("2 - Thread State : " + th.getState());
        
        while(true) {
            Thread.State state = th.getState();
            System.out.println(state);
            if (state == Thread.State.TERMINATED) break;
        }
    }
}

class TheThread extends Thread{
    public TheThread() {  }
    
    public void run() {
      try {
        sleep(1); 
        for(int i = 0; i < 100; i++);   
      } catch (InterruptedException ie){
        ie.printStackTrace();
      }
    }
}
Program çıktısı aşağıdaki gibi olacaktır:

1 - Thread State : NEW
2 - Thread State : RUNNABLE
RUNNABLE
RUNNABLE
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
TIMED_WAITING
...
RUNNABLE
TERMINATED

Peki yukarıdaki kod bloğunda ne yaptık?

İlk olarak TheThread sınıfımızı bir nesneye atadık. Bu durumda thread NEW durumuna geçmiş oldu ve ardından start ettiğimizde RUNNABLE durumuna geçti. Sonrasındathreadı sleep metodu ile beklemeye aldığımızda TIMED_WAITING durumuna geçti ve döngü içerisinde bu konumda kalmasını sağladık. Döngü bitince tekrardan RUNNABLE konumuna geçti ve en son görevini tamamlayıp run metodundan çıkınca TERMINATED durumuna geçmiş oldu.

Bu yazımızda buraya kadar.

Burak Hamdi TUFAN


Tags


Share this Post

Send with Whatsapp

Post a Comment

Success! Your comment sent to post. It will be showed after confirmation.
Error! There was an error sending your comment.

Comments

  • There is no comment. Be the owner of first comment...