İş parçacığı yaşam döngüsü ve iş parçacığı durumları - 1

"Merhaba, Amigo!"

"Yeni bir konu başlatacağız: ileti dizileri."

"Hadi başlayalım. Bugün bir Thread çalışırken bir Thread nesnesinin içinden geçtiği (veya geçebileceği) durumları inceleyeceğiz."

"Şu anda kaç tane eyalet sayabilirsin, Amigo?"

"İki. İlki, start() yöntemi çağrılmadan önceki bir ileti dizisidir: nesne mevcuttur, ancak ileti dizisi henüz etkin değildir. İkincisi, start() yöntemi çağrıldıktan sonradır: ileti dizisi bir şey yaptığında önemli."

"Haklısın - böyle bir ayrım var. Bu durumlara yeni ve çalışıyor deniyor , ama bu sadece başlangıç."

"İlk olarak, bir noktada iş parçacığı çalışmayı bitirecek, bu da Thread nesnesinin var olduğu ancak iş parçacığının yeni veya çalışır durumda olmadığı bir durum olabileceği anlamına gelir. "İş parçacığının çalışmayı bitirdiği bu duruma denir. sonlandırıldı ."

"Ama dahası da var. Herhangi bir zamanda yalnızca bir iş parçacığının gerçekten çalıştığını unutmayın. Eşzamanlı çalışma gibi görünen şey, aslında işlemcinin sürekli olarak iş parçacığından iş parçacığına atlamasıdır. İş parçacığının göründüğü zaman için ayrı bir durum vardır. çalışıyor, ancak aslında sırasını bekliyor: buna Ready-to-run denir . Bir iş parçacığı çalışırken, sürekli olarak çalışır halden hazır hale gelir ve tekrar aktif hale geldiğinde tekrar çalışır hale gelir."

" Start () yöntemi çağrıldıktan hemen sonra , iş parçacığına çalışmaya hazır durumu atanır ve JVM'nin arasında geçiş yaptığı paylaşılan bir iş parçacığı listesine yerleştirilir."

"Bu çok zor değil. Çalışmaya başlamadan önce yeni halini alıyor. Bittikten sonra sonlandırılıyor . Çalışırken thread çalışıyor , beklerken hazır durumda . ."

"Kısa konuşman harika ama haklısın."

"Ama dahası da var. İş parçacığı bloke edilebilir. Örneğin, senkronize bir bloğa girdiğinizde . Bir iş parçacığı, senkronize olarak işaretlenmiş bir kod bloğuna ulaşırsa ve başka bir iş parçacığı onu kullanıyorsa, iş parçacığımız bloke durumuna girecek ve bekleyecektir. nesnenin muteksinin (kilidinin) serbest bırakılması için."

"Eyaletlerle ilgili bu durum şöyle görünüyor:"

İş parçacığı yaşam döngüsü ve iş parçacığı durumları - 2

"Ama dahası da var. Bekleme denen ayrı bir durum da var . Bu, bir iş parçacığının bloke olmadığı ama aynı zamanda hazır olmadığı zamandır . Örneğin, başka bir iş parçacığında birleştirme () yöntemini çağırdığınızda ."

Başka bir Thread nesnesinde join()'i çağırdığımızda, sanki bizim thread'imiz ona "katılıyor", ama gerçekte sadece diğer thread'in bitmesini bekliyor.

"Ayrıca, bir iş parçacığını çağrıldığında bekleme durumuna geçiren wait () yöntemi de (wait/notify/notifyAll üçlü yöntemlerinden) vardır ."

"Vay."

"Dur bir dakika! Daha fazlası var. Örneğin bir thread uyku yöntemini çağırarak uyku moduna geçebilir. Bunun için ayrı bir durum da vardır. Buna « zamanlı bekleme » denir . Bir bekleme yöntemini, wait(timeout) veya join(timeout) gibi bir parametre ile çağırırsanız, iş parçacığı süreli bekleme durumuna girer."

"İşte tam şema:"

İş parçacığı yaşam döngüsü ve iş parçacığı durumları - 3

"Hmm. Hepsi bu kadar mı? Yoksa 10 ilginç durum daha var mı?"

"Şimdilik bu kadar."

"Pratikte, sadece ilk diyagramı hatırlayabilirsiniz. Daha basit. Ama ikincisi daha doğru."

"Garip bir şekilde, İnternette bir sürü İplik durumu diyagramı var ve hepsi farklı."

"Sana bu yüzden bu diyagramı verdim - en eksiksiz ve doğru olanı bu."

"Bu diyagramda, hazır ve çalışır durumdaki durumlar, çalıştırılabilir adı verilen tek bir blokta birleştirilmiştir. Nedenini biliyor musunuz?"

"Hayır. İlk defa böyle bir şey görüyorum."

" Thread sınıfı, State adlı bir iç sınıfa ve ayrıca ortak bir State getState() yöntemine sahiptir."

Örnek
public enum State
{
 NEW,
 RUNNABLE,
 BLOCKED,
 WAITING,
 TIMED_WAITING,
 TERMINATED;
}

" GetState () yöntemini bir Thread nesnesinde her zaman çağırabilir ve mevcut durumunu öğrenebilirsiniz. Ve tabii ki bu, State enum değerlerinden biri olacaktır."

"Anlıyorum. Yani, gerçek durumlar JVM'nin içinde, ancak State getState() yöntemini kullanarak Java kodu aracılığıyla erişebileceğiniz durumlar da var."

"Ve bunu hangi koşullar altında kullanırdım?"

"Büyük olasılıkla, asla."

"Ama iş parçacıklarının içinde neler olup bittiğini bilmek zorundasın. Aksi takdirde, bir sürü hatan olur ve bunlara neyin sebep olduğunu tahmin bile edemezsin."

"Ayrıca, işverenler mülakatlar sırasında İplik durumları hakkında soru sormayı severler."