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.
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.
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
Comments