Pure Java – 86 Thread – 03

Merhaba Arkadaslar
Bu yazida bir Thread’in durumundan/state bahsedecegiz. java.lang.Thread sinifinda State isminde bir enum yer almaktadir. Bu enumda su degerler mevcuttur.

public class Thread implements Runnable {
  public enum State {

        NEW,

        RUNNABLE,

        BLOCKED,

        WAITING,

        TIMED_WAITING,

        TERMINATED;
    }

}

NEW
Thread objesi/instance olusturuldugu fakat start metodunun henuz cagrilmadigi durumda thread’in durumu NEW ‘dir.
Bu durumda Thread objesi mevcuttur ve live durumundadir fakat thread calismaya baslamadigi icin not-alive durumdadir.

RUNNABLE
Thread , RUNNABLE durumuna ilk olarak start() metodu cagrildigi zaman girer, bununla birlikte blocked/waitigin/sleeping durumlarindan tekrar RUNNABLE duruma donebilir.
Thread , RUNNABLE durumunda alive durumdadir.
RUNNABLE durumu , thread’in calismaya(running duruma gecme) uygun/eligible oldugu durumdur.

RUNNING
Thread Scheduler ,thread pool/havuzundan runnable durumdaki(state) bir thread’i secer ve bu thread calismaya baslar(running).
RUNNING durumu asil action’in oldugu durumdur. RUNNING durumundan tekrar RUNNABLE duruma donus ya da waiting/blocking/sleeping durumlarina donus soz konusudur.

Burada onemli nokta Thread.State enum’inda RUNNING degeri yoktur. Burada RUNNING durumundan kasit hali hazirda Thread Scheduler tarafindan secilen RUNNABLE thread’tir.

WAITING
WAITING
state , thread’in calismaya uygun/eligible olmadigi bir durumdur. Thread bu durumda alive durumdadir fakat Thread Scheduler tarafindan secilmek icin uygun degildir(not eligible). Sadece runnable durumunda olan bir thread running durumu icin uygun olabilir (eligible)

WAITING durumunun anlami bir thread diger bir thread’in belirli bir isi yapmasini bekliyor demektir.

Bir Thread’in durumu su durumlarda WAITING olabilir.

java.lang.Object

public final native void wait() throws InterruptedException;

Bir thread , bir obje uzerinden wait metodunu cagirdiginda WAITING state’e gecer. Bir thread WAITING duruma gectiginde bir baska thread’in ilgili obje uzerinden notify() ya da notifyAll() metodunu cagirmasi ile WAITING durumu sonlanir ve  RUNNABLE duruma gecilir.

java.lang.Thread

public final void join() throws InterruptedException

join metodu , bir thread bitene kadar(run metodu sonlana kadar) diger thread lerin beklemesini saglar.

join metodu cagrildiginda, hali hazirda calisan thread(currenct thread) , thread1 thread’i islemini bitirene kadar bekleyecektir(wait).

thread1.join();

TIMED_WAITING
TIMED_WAITING durumu da thread’in calismaya uygun/eligible olmadigi durumlardir. Thread bu durumda alive durumdadir fakat Thread Scheduler tarafindan secilmek icin uygun degildir.

join ve wait metotlarinin overloaded halleri mevcuttur. Overloaded metotlarinda belirli bir timeout suresi kullanilabilir. Bu durumda TIMED_WAITING durumu soz konusu olacaktir.

java.lang.Object

    public final native void wait(long timeout) throws InterruptedException;

Bir thread , bir obje uzerinden wait(long timeout) metodunu cagirdiginda TIMED_WAITING state’e gecer. Bir thread TIMED_WAITING duruma gectiginde bir baska thread’in ilgili obje uzerinden notify() ya da notifyAll() metodunu cagirmasi ya da timeout ile WAITING durumu sonlanir ve  RUNNABLE duruma gecilir.

java.lang.Thread

public final synchronized void join(long millis) throws InterruptedException

join metodu , bir thread’in diger thread islemini bitirene kadar beklemesini saglar fakat burada oldugu gibi parametre alan overloaded join metodu thread’in belirtilen timeout suresi kadar beklemesini saglar.

java.lang.Thread

public static native void sleep(long millis) throws InterruptedException;

Bir thread , SLEEPING durumunda olabilir. sleep metodu static bir metottur , cagrildigi noktada hali hazirda calisan thread’i milisaniye cinsinden sleeping durumuna girmesini saglar.

Burada onemli nokta uyuma suresi bittiginde tekrar calismaya devam edeceginin bir garantisi yoktur !

Ilgili Thread sleeping durumundan sonra tekrar RUNNABLE duruma gecer.Bu durumda ne zaman Thread Scheduler tarafindan secilirse tekrar RUNNING durumuna gececektir.

SLEEPING durumu da ayri bir enum degeri yoktur. Daha ozel isim olarak SLEEPING kavrami kullanilmaktadir. Yoksa sleep metodu , ilgili thread icin TIMED_WAITING durumuna sahip olmasina neden olur.

BLOCKED
snychronized bir block’a ya da metoda ayni anda sadece bir thread girebilir. Ilgili objenin kilidine (object lock) hangi thread sahipse o tread  isini bitirene kadar bir baska thread synchronizded metoda ya da block’a giris yapamaz. Burada oldugu gibi diger threadlerin obje kildi icin bekledigi duruma BLOCKED durumu denilir.

TERMINATED
Thread calismasini sonlandirdiginda yani run metodu sonlandiginda DEAD yani TERMINATED duruma gecer.
TERMINATED duruma gecen bir thread tekrar RUNNABLE duruma gecemez.

thread states

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *