Java'da bir iş parçacığı her zaman aşağıdaki durumların herhangi birinde bulunur. Bu durumlar şunlardır:
- Yeni
- Aktif
- Engellendi / Bekleniyor
- Zamanlı Bekleme
- Sonlandırılmış
Farklı İş Parçacığı Durumlarının Açıklaması
Yeni: Yeni bir iş parçacığı oluşturulduğunda, her zaman yeni durumdadır. Yeni durumdaki bir iş parçacığı için kod henüz çalıştırılmadı ve dolayısıyla yürütülmesine başlamadı.
Aktif: Bir iş parçacığı start() yöntemini çağırdığında yeni durumdan etkin duruma geçer. Aktif durum, içinde iki durum içerir: biri çalıştırılabilir ve diğeri koşma .
Çoklu iş parçacıklarını uygulayan bir program, her bir iş parçacığına sabit bir zaman dilimi kazandırır. Her iş parçacığı kısa bir süre boyunca çalışır ve tahsis edilen zaman dilimi bittiğinde, iş parçacığı gönüllü olarak CPU'yu diğer iş parçacığına verir, böylece diğer iş parçacıkları da kendi zaman dilimi boyunca çalışabilir. Böyle bir senaryo meydana geldiğinde, koşmaya hazır olan ve koşma sırasının kendilerine gelmesini bekleyen tüm iş parçacıkları çalıştırılabilir durumda kalır. Çalıştırılabilir durumda, iş parçacıklarının bulunduğu yerde bir kuyruk vardır.
Engellendi veya Bekleniyor: Bir iş parçacığı belirli bir süre boyunca (kalıcı olarak değil) etkin olmadığında, iş parçacığı ya engellenmiş durumdadır ya da bekleme durumundadır.
Örneğin, bir iş parçacığı (diyelim ki adı A) yazıcıdan bazı verileri yazdırmak isteyebilir. Ancak aynı zamanda diğer iş parçacığı (adı B diyelim) bazı verileri yazdırmak için yazıcıyı kullanıyor. Bu nedenle A iş parçacığının B iş parçacığının yazıcıyı kullanmasını beklemesi gerekir. Bu nedenle A iş parçacığı engellenmiş durumdadır. Engellenen durumdaki bir iş parçacığı herhangi bir yürütme gerçekleştiremez ve bu nedenle Merkezi İşlem Biriminin (CPU) hiçbir döngüsünü asla tüketmez. Dolayısıyla, iş parçacığı zamanlayıcı, beklemede veya engellenmiş durumdaki A iş parçacığını yeniden etkinleştirene kadar A iş parçacığının boşta kaldığını söyleyebiliriz.
Ana iş parçacığı join() yöntemini çağırdığında, ana iş parçacığının bekleme durumunda olduğu söylenir. Ana iş parçacığı daha sonra alt iş parçacıklarının görevlerini tamamlamasını bekler. Alt iş parçacıkları işini tamamladığında, ana iş parçacığına bir bildirim gönderilir ve bu, iş parçacığını yeniden bekleme durumundan aktif duruma geçirir.
Beklemede veya engellenmiş durumda çok sayıda iş parçacığı varsa, hangi iş parçacığının seçileceğini ve hangisinin reddedileceğini belirlemek iş parçacığı zamanlayıcının görevidir ve seçilen iş parçacığına daha sonra çalıştırma fırsatı verilir.
Zamanlanmış Bekleme: Bazen beklemek açlığa yol açar. Örneğin, bir iş parçacığı (adı A'dır) bir kodun kritik bölümüne girmiştir ve bu kritik bölümden ayrılmaya istekli değildir. Böyle bir senaryoda, başka bir iş parçacığının (adı B'dir) sonsuza kadar beklemesi gerekir, bu da açlığa yol açar. Böyle bir senaryoyu önlemek için, B iş parçacığına zamanlanmış bir bekleme durumu verilir. Bu nedenle, iş parçacığı, sonsuza kadar değil, belirli bir süre boyunca bekleme durumunda kalır. Zamanlanmış beklemenin gerçek bir örneği, belirli bir iş parçacığında uyku() yöntemini çağırdığımız zamandır. Sleep() yöntemi, iş parçacığını zamanlanmış bekleme durumuna geçirir. Süre dolduktan sonra iş parçacığı uyanır ve daha önce kaldığı yerden yürütmeye başlar.
Sonlandırılmış: Bir iş parçacığı aşağıdaki nedenlerden dolayı sonlandırma durumuna ulaşır:
- Bir iş parçacığı işini bitirdiğinde normal şekilde var olur veya sona erer.
Sonlandırılmış bir iş parçacığı, iş parçacığının artık sistemde olmadığı anlamına gelir. Başka bir deyişle, iş parçacığı ölüdür ve ölü iş parçacığının yeniden doğmasına (öldürüldükten sonra aktif) imkan yoktur.
Aşağıdaki şemada bir iş parçacığının yaşam döngüsünde yer alan farklı durumlar gösterilmektedir.
İş parçacığı durumlarının uygulanması
Java'da, bir iş parçacığının mevcut durumu aşağıdakileri kullanarak elde edilebilir: Thread.getState() yöntem. java.lang.Thread.State Java sınıfı, bir iş parçacığının durumunu temsil eden ENUM sabitlerini sağlar. Bu sabitler şunlardır:
dize bölünmüş java
public static final Thread.State NEW
Bir iş parçacığının YENİ durumu olan ilk durumunu temsil eder.
public static final Thread.State RUNNABLE
Çalıştırılabilir durumu temsil eder. Bu, bir iş parçacığının kuyrukta çalıştırılmak için beklediği anlamına gelir.
public static final Thread.State BLOCKED
Engellenmiş durumu temsil eder. Bu durumda iş parçacığı bir kilit almayı bekliyor.
public static final Thread.State WAITING
Bekleme durumunu temsil eder. Bir iş parçacığı, Object.wait() yöntemini veya Thread.join() yöntemini zaman aşımı olmaksızın çağırdığında bu duruma geçecektir. Bekleme durumundaki bir iş parçacığı, başka bir iş parçacığının görevini tamamlamasını bekliyor.
public static final Thread.State TIMED_WAITING
Zamanlanmış bekleme durumunu temsil eder. Bekleme ve zamanlı bekleme arasındaki temel fark zaman kısıtlamasıdır. Beklemenin zaman kısıtlaması yoktur, oysa süreli beklemenin zaman kısıtlaması vardır. Aşağıdaki yöntemi çağıran bir iş parçacığı, zamanlanmış bekleme durumuna ulaşır.
- uyumak
- zaman aşımı ile katıl
- zaman aşımı ile bekle
- Parke kadar
- parkNanolar
public static final Thread.State TERMINATED
Sonlandırılmış veya ölü bir iş parçacığının son durumunu temsil eder. Sonlandırılmış bir iş parçacığı, yürütülmesini tamamladığı anlamına gelir.
Konu Durumlarını Göstermeye Yönelik Java Programı
Aşağıdaki Java programı, yukarıda tanımlanan bir iş parçacığının bazı durumlarını gösterir.
Dosya adı: ThreadState.java
// ABC class implements the interface Runnable class ABC implements Runnable { public void run() { // try-catch block try { // moving thread t2 to the state timed waiting Thread.sleep(100); } catch (InterruptedException ie) { ie.printStackTrace(); } System.out.println('The state of thread t1 while it invoked the method join() on thread t2 -'+ ThreadState.t1.getState()); // try-catch block try { Thread.sleep(200); } catch (InterruptedException ie) { ie.printStackTrace(); } } } // ThreadState class implements the interface Runnable public class ThreadState implements Runnable { public static Thread t1; public static ThreadState obj; // main method public static void main(String argvs[]) { // creating an object of the class ThreadState obj = new ThreadState(); t1 = new Thread(obj); // thread t1 is spawned // The thread t1 is currently in the NEW state. System.out.println('The state of thread t1 after spawning it - ' + t1.getState()); // invoking the start() method on // the thread t1 t1.start(); // thread t1 is moved to the Runnable state System.out.println('The state of thread t1 after invoking the method start() on it - ' + t1.getState()); } public void run() { ABC myObj = new ABC(); Thread t2 = new Thread(myObj); // thread t2 is created and is currently in the NEW state. System.out.println('The state of thread t2 after spawning it - '+ t2.getState()); t2.start(); // thread t2 is moved to the runnable state System.out.println('the state of thread t2 after calling the method start() on it - ' + t2.getState()); // try-catch block for the smooth flow of the program try { // moving the thread t1 to the state timed waiting Thread.sleep(200); } catch (InterruptedException ie) { ie.printStackTrace(); } System.out.println('The state of thread t2 after invoking the method sleep() on it - '+ t2.getState() ); // try-catch block for the smooth flow of the program try { // waiting for thread t2 to complete its execution t2.join(); } catch (InterruptedException ie) { ie.printStackTrace(); } System.out.println('The state of thread t2 when it has completed it's execution - ' + t2.getState()); } }
Çıktı:
The state of thread t1 after spawning it - NEW The state of thread t1 after invoking the method start() on it - RUNNABLE The state of thread t2 after spawning it - NEW the state of thread t2 after calling the method start() on it - RUNNABLE The state of thread t1 while it invoked the method join() on thread t2 -TIMED_WAITING The state of thread t2 after invoking the method sleep() on it - TIMED_WAITING The state of thread t2 when it has completed it's execution - TERMINATED
Açıklama: Ne zaman yeni bir iş parçacığı yaratsak, o iş parçacığı yeni duruma ulaşır. Bir iş parçacığında start() yöntemi çağrıldığında, iş parçacığı zamanlayıcısı bu iş parçacığını çalıştırılabilir duruma taşır. Herhangi bir iş parçacığı örneğinde join() yöntemi çağrıldığında, bu ifadeyi yürüten mevcut iş parçacığının bu iş parçacığının yürütülmesini bitirmesini beklemesi gerekir, yani o iş parçacığını sonlandırılmış duruma taşımak. Bu nedenle, son print ifadesi konsolda yazdırılmadan önce, program t2 iş parçacığında join() yöntemini çağırır, t2 iş parçacığının yürütülmesini bitirirken t1 iş parçacığının beklemesini sağlar ve böylece t2 iş parçacığının sonlandırılmış veya ölü duruma geçmesini sağlar. . t1 iş parçacığı bekleme durumuna geçer çünkü t2 iş parçacığında join() yöntemini çağırdığı için t2 iş parçacığının yürütülmesini bitirmesini bekler.