0

Java MultiThreading Wait ve Notify Kavramları – Örnek Uygulama

Merhaba Arkadaşlar bu yazımda java’da Advance ( ileri seviye ) konularından MultiThreading ile ilgili kavramlardan  wait() ve notify()  metodlarından bahsetmeye çalışacağım.  Programcılık gerçek dünyanın dışında bir konu değil zaten o yüzden gerçek dünyadan bir hikaye anlatıp konunun teknik tarafına geçmek istiyorum. Bildiğiniz gibi MultiThreading olayı günümüzdeki bilgisayarların aşırı gelişmişlik düzeyinin sonucu olarak kaçınılmaz.   Bu sebeple bizlerde proje yaparken bu teknolojiyi projelerimize eklemeliyiz. Aksi halde projemizin gelişmişlik seviyesi altlarda olacak. 8 tane çekirdek barındıran bir işlemciyi tek bir thread’e mahkum etmek haksızlık olur değil mi ? O halde aynı anda eş zamanlı bir sürü iş yapalım… işte kısaca Multithreading . 

Tabi bu güzel bir teklif ancak burada şöyle bir durumda karşımıza çıkıyor. Birçok Thread kullancaksanız öyle bir yönetmeniz lazım ki hepsi birbiri ile tam senkron çalışsın . Eğer bu senkronizasyonu sağlayamazsanız projeniz pert olacaktır. Demek MultiThreading güzel bir şey ancak iyi yönetilirse. Trafiğe araç çıkması güzeldir ancak trafik kuralları ve trafik ışıkları düzenli bir şekilde trafiği yönetemezse curcunayı siz düşünün… Şimdi gelilim hikayeye ..

İki tane adam varmış …. Bu iki adam bir kuyu kazma ile görevlendirilmiş . Birisi kazma ile kazacak diğeri ise kürek ile kazmacının kazdığı yeri temizleyecek. Şimdi bu ikisi Kazılacak yerin başına gittiler ve ikisi de çalışmaya başladılar….. bence ikisi de aynı anda başlayamaz…. Neden ? Kazmacının kazması lazım ki ; kürekci temizlesin . Eğer ikisi de birbirine bakmayıp birisi kazılmamış yere kürek sallasa ve diğeri de önünde bir şey var mı yok mu diye kontrol etmese , küreçinin kafasına kazma gelebililir ve kazma işlemi yapılamaz ve kürekcinin de küreği kırılır sonuçta iş yapılamaz… İşte size programın çökmesi….

İşte bu örnekte nasıl olmalı ; kazmacı ile kürekçi senkron bir şekilde çalışmalı . Yani  kazılacak yerin başına gidince önce kürekçi durmalı ve kazmacı biraz kazmalı.. sonra kazmacı çekilmeli ve kürekçi kazılan kısmı temizlemeli ve bu şekilde işlem sonlanmalı. Aslında gerçek dünyada insanlar zaten bunu otomatik yapar ancak bilgisayar’a en bariz bir işi bile söylemezseniz yapmadığı için bunu siz ayarlamalısınız.  İşte ilk başta kürekci wait() durumunda olmalı ve kazmacının notify() yapmasını beklemeli. Kazmacı notify() yapınca kendisi de wait() durumuna geçmeli. Kürekçinin işi bitince kazmacıya notify()  yapmalı ve kendisi de wait() durumuna geçmeli ki senkron bir şekilde iş yapılıp bitsin..

Birden fazla thread’in aynı nesne üzerinde çalıştığı durumlarda bunların uygun bir şekilde koordine edilmesi lazımdır. Aksi halde hatalar oluşacak hatta program kilitlenecektir. Yine başka önemli bir husus olarak erişilen nesnede kullanılan metodlar syncronized  metodlar olmalı. wait() metodu ile bir thread beklemeye alınırken ve notify() metodu ile bekleyen thread çalışmaya devam eder. İşte iki örneğimiz var inşallah anlaşılmıştır . 

 

 

admin

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir