Örnekle Java İş Parçacığı Durumuna Giriş – Bir İş Parçacığının Yaşam Döngüsü
Yayınlanan: 2019-01-11
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.

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.
1 |
Thread myThread = new MyThreadClass ( ) ; |
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:
1 2 |
Thread myThread = new MyThreadClass ( ) ; myThread . start ( ) ; |
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
1 2 3 4 5 6 |
Thread myThread = new MyThreadClass ( ) ; myThread . start ( ) ; try { myThread . sleep ( 10000 ) ; } catch ( InterruptedException e ) { } |
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()
veyanotifyAll()
çağırarak değişkenden vazgeçmesi gerekir. - G/Ç'de bir iş parçacığı engellenirse, belirtilen G/Ç komutunun tamamlanması gerekir.

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

1 2 3 4 5 6 7 |
public void run ( ) { int i = 0 ; while ( i < 100 ) { i ++ ; System . out . println ( "i = " + i ) ; } } |
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ığı.
1 2 3 4 5 6 7 |
Thread myThread = new MyThreadClass ( ) ; myThread . start ( ) ; try { Thread . currentThread ( ) . sleep ( 10000 ) ; } catch ( InterruptedException e ) { } myThread . stop ( ) ; |
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ı.