Örnekle Java İş Parçacığı Durumuna Giriş – Bir İş Parçacığının Yaşam Döngüsü

Yayınlanan: 2019-01-11
Örnekle Java İş Parçacığı Durumuna Giriş

Konu Durumları

Aşağıdaki şema, bir Java iş parçacığının ömrü boyunca herhangi bir noktada bulunabileceği çeşitli durumları ve hangi yöntem çağrılarının başka bir duruma geçişe neden olduğunu gösterir. Bu diyagram tam bir sonlu durum diyagramı değil, daha çok bir iş parçacığının ömrünün daha ilginç ve ortak yönlerine genel bir bakıştır.

Aşağıdaki sorulardan herhangi birine sahipseniz doğru yerdesiniz:

  • Java'da Bir Konunun Yaşam Döngüsü
  • Java'da Bir İş Parçacığının Yaşam Döngüsü ve Durumları
  • Java İş Parçacığı Durumlarını Anlama

Bu sayfanın geri kalanı, bir Thread's life cycle , durumu açısından tartışır.

Örnekle Java İş Parçacığı Durumu

Yeni Konu

Aşağıdaki ifade yeni bir iş parçacığı oluşturur, ancak onu başlatmaz ve böylece iş parçacığını diyagramda Yeni İplik olarak etiketlenmiş durumda bırakır.

Bir iş parçacığı New Thread durumundayken, yalnızca boş bir Thread nesnesidir. Bunun için henüz hiçbir sistem kaynağı ayrılmadı. Böylece bir iş parçacığı bu durumdayken, yalnızca iş parçacığını başlatabilir veya durdurabilirsiniz; bir iş parçacığı bu durumdayken start() veya stop() dışında başka bir yöntemi çağırmak hiçbir anlam ifade etmez ve bir IllegalThreadStateException'a neden olur.

çalıştırılabilir

Şimdi bu iki kod satırını düşünün:

start() yöntemi, iş parçacığını çalıştırmak için gerekli sistem kaynaklarını yaratır, iş parçacığını çalışacak şekilde zamanlar ve iş parçacığının run() yöntemini çağırır. Bu noktada iş parçacığı “Çalıştırılabilir” durumdadır. Bu duruma, "Çalışıyor" yerine "Çalıştırılabilir" denir, çünkü iş parçacığı bu durumdayken aslında çalışmıyor olabilir. Birçok bilgisayarın tek bir işlemcisi vardır, bu da tüm "Çalıştırılabilir" iş parçacıklarını aynı anda çalıştırmayı imkansız kılar.

Bu nedenle, Java çalışma zamanı sistemi, işlemciyi tüm "Çalıştırılabilir" iş parçacıkları arasında paylaşan bir zamanlama şeması uygulamalıdır. Ancak, çoğu amaç için “Çalıştırılabilir” durumunu basitçe “Çalışıyor” olarak düşünebilirsiniz. Bir iş parçacığı çalışırken—“Çalıştırılabilir”dir ve mevcut iş parçacığıdır— run() içindeki talimatlar sırayla yürütülür.

Çalıştırılamaz

Bu dört olaydan biri gerçekleştiğinde, bir iş parçacığı Not Runnable durumuna girer:

  • birisi suspend() yöntemini çağırır
  • birisi sleep() yöntemini çağırır
  • iş parçacığı bir koşul değişkenini beklemek için wait() yöntemini kullanır
  • iş parçacığı G/Ç'de engelleniyor.

Örneğin, bu kod parçasındaki kalın satır

myThread 10 saniye (10.000 milisaniye) uyku moduna geçirir. Bu 10 saniye boyunca, işlemci kullanılabilir hale gelse bile myThread çalışmaz. 10 saniye dolduktan sonra myThread tekrar “Çalıştırılabilir” hale gelir ve şimdi işlemci kullanılabilir hale myThread çalışır.

Yukarıda listelenen "Çalıştırılamaz" durumuna "girişlerin" her biri için, iş parçacığını "Çalıştırılabilir" durumuna döndüren belirli ve farklı bir kaçış yolu vardır. Bir kaçış yolu, yalnızca kendisine karşılık gelen “giriş” için çalışır. Örneğin, bir iş parçacığı uyku moduna alınmışsa, iş parçacığı yeniden "Çalıştırılabilir" hale gelmeden önce belirtilen milisaniye sayısı geçmelidir. Uyuyan bir iş parçacığında resume() çağrısının hiçbir etkisi yoktur.

Aşağıda, "Çalıştırılamaz" durumuna her giriş için kaçış rotası gösterilmektedir.

  • Bir iş parçacığı uykuya alınmışsa, belirtilen milisaniye sayısı geçmelidir.
  • Bir iş parçacığı askıya alınmışsa, birisinin resume() yöntemini çağırması gerekir.
  • Bir iş parçacığı bir koşul değişkeninde bekliyorsa, değişkenin sahibi ne olursa olsun, notify() veya notifyAll() çağırarak değişkenden vazgeçmesi gerekir.
  • G/Ç'de bir iş parçacığı engellenirse, belirtilen G/Ç komutunun tamamlanması gerekir.
java-thread-öğreticisi

Ölü

Bir iplik iki şekilde ölebilir: ya doğal sebeplerden ya da öldürülerek (durdurularak). Bir iş parçacığı, run() yöntemi normal olarak çıktığında doğal olarak ölür. Örneğin, bu yöntemdeki while döngüsü sonlu bir döngüdür; 100 kez yinelenir ve ardından çıkar.

Bu run() yöntemine sahip bir iş parçacığı, döngüden ve run() yöntemi tamamlandıktan sonra doğal olarak ölecektir.

Ayrıca stop() yöntemini çağırarak istediğiniz zaman bir iş parçacığını öldürebilirsiniz. Bu kod parçacığı.

myThread oluşturur ve başlatır, ardından mevcut iş parçacığını 10 saniyeliğine uyku moduna geçirir. Geçerli iş parçacığı uyandığında, kod bölümündeki kalın satır myThread öldürür.

stop() yöntemi, onu öldürmek için iş parçacığına bir ThreadDeath nesnesi atar. Böylece bir iş parçacığı bu şekilde öldürüldüğünde eşzamansız olarak ölür. ThreadDeath istisnasını gerçekten aldığında iş parçacığı ölecek.

IllegalThreadStateException

Bir iş parçacığında bir yöntemi çağırdığınızda ve bu iş parçacığının durumu bu yöntem çağrısına izin vermediğinizde, çalışma zamanı sistemi bir IllegalThreadStateException oluşturur. Örneğin, “Runnable” olmayan bir iş parçacığında suspend() öğesini çağırdığınızda IllegalThreadStateException atılır.

Bu derste şimdiye kadarki çeşitli evre örneklerinde gösterildiği gibi, bir istisna oluşturabilen bir evre yöntemini çağırdığınızda, istisnayı yakalayıp işlemeli veya çağıran yöntemin yakalanmamış istisnayı fırlattığını bildirmelisiniz.

isAlive() Yöntemi

Ve iş parçacığı durumu hakkında son bir söz: Thread sınıfı için programlama arabirimi, isAlive() adlı bir yöntem içerir. Eğer iş parçacığı başlatılmışsa ve durdurulmamışsa isAlive() işlevi true değerini döndürür. Bu nedenle, isAlive() yöntemi false döndürürse, iş parçacığının bir "Yeni Konu" veya "Ölü" olduğunu bilirsiniz.

isAlive() yöntemi true değerini döndürürse, iş parçacığının "Çalıştırılabilir" veya "Çalıştırılamaz" olduğunu bilirsiniz. “Yeni Konu” ile “Ölü” konu arasında ayrım yapamazsınız; ne de "Çalıştırılabilir" bir dizi ile "Çalıştırılamaz" bir dizi arasında ayrım yapamazsınız.

Karmaşık iş parçacığı örneklerine bakarken, bu gerçekten harika öğreticiyi nette buldum. Bunu herkes dikkatlice okumalı.