JAVAFX Concurrent Framework Part-2

Concurrent Framework yazımızın ikinci başlığından merhaba kaldığımız yerden devam edelim. Tek yazıda bitirmek istemedim çünkü uzun bir konu sıkıcı olmasın hemde parça parça incelemek anlamayı kolaylaştırır diye düşünüyorum. o zaman kaldığımız yerden devam edelim. 

1.3  Worker nesnesinin Durumları ve Değişimleri

Worker nesnesinin yaşam döngüsüne baktığımızda bazı farklı durumlar (state) geçirdiğini görüyoruz. Bu durumların neler olduğunu yazının başındaki bahsettiğim enum’dan görebiliriz. Worker.State enum’u içinde şu state lerin olduğunu görüyoruz. 

  • Worker.State.READY
  • Worker.State.SCHEDULED
  • Worker.State.RUNNING
  • Worker.State.SUCCEEDED
  • Worker.State.CANCELLED
  • Worker.State.FAILED

Worker ilk oluşturulduğunda state’i  READY dir. sonra çalıştırılmadan önce  SCHEDULED state’i ne geçer  .Çalışmaya başladığında RUNNING state’ine geçer.  Eğer İşlem başarılı bir şekilde tamamlanırsa state SUCCEEDED olur. Bu cümle biraz garip oldu ama ingilizce – Türkçe ancak bu kadar oluyor. Eğer çalışma esnasında bir hata oluşursa FAILED statesine geçer. Bu durumun bir sebebi cancel() metodu ile sonlandırmakta olabilir. Bu şekilde yaşam döngüsünü tarif etmiş olduk. 

READY,SCHEDULED ve RUNNING  durumlarından CANCELLED durumuna geçilebilir. Task nesnesi CANCELLED durumundan tekrar diğer durumlara geçemez çünkü Task nesnesi tek çalıştırmalıktır.  Eğer CANCELLED durumundan diğer durumlara geçmek istenirse Service sınıfından extend edilen bir iş parçacığı kullanmak gerekir .

1.4  Worker Properties 

Worker interfacemiz 9 tane read-only properties ‘ i barındırmaktadır. 

  1. title
  2. message
  3. running
  4. state
  5. progress
  6. workDone
  7. totalWork
  8. value
  9. exception

Eğer Worker nesnesini implemente eden nesneden türettiğiniz bir nesneniz varsa  yukarıda gördüğünüz özelliklere sahip oldunuz demektir ve bunlara uygulamanızın ana thread’inden ulaşıp istediğiniz gibi kullanabilirsiniz. Ayrıca bu özellikler Task içinde sürekli güncellenirken ana thread’de bağladığınız nesnelerde bu değişimleri izleyip size yansıtabilir .

  • title : yapılan işin başlığını gösterir.
  • message: işlem yapılırken yapılan işleme ait detayları yansıtır ( tabi bunları siz yazacaksınız :=) ) 
  • running: worker nesnemizin durumunu gösterir. SCHEDULED , READY durumlarında true , diğer durumlarda false döndürür. 
  • state: Worker nesnemizin durumunu gösterir bu durumlar yukarıda belirttiğimiz Worker.State enum’unun içindeki değerlerdir.
  • totalWork,workDone bu iki özellik bize bir oran sunar. totalWork yapılacak toplam işin miktarını belirtir ( örneğin %100) gibi , workDone ise yapılan işin miktarını belirtir( %5) gibi. progress ise bu ikisinin oranını verir. 
  • value ise bildiğimiz gibi call() metodunu override etmiştik ( Worker interfacesi bizi buna zorlamıştı) ve bu metodumuz geri bir sonuç döndürüyordu işte dönen bu sonucu value özelliğimiz tutuyor. 
  • İşlem sırasında bir exception oluşup durum FAILED olabilir. exception property’si bunu gösterir. 

Genellikle Task nesnesi çalışırken işlem ile ilgili detaylar kullanıcıya gösterilmek istenir. Aksi halde siz arkada bir işlem yaparsınız ama kullanıcı beklemesi gerektiğini bilmez. Concurrency Framework , Worker nesnesinin içindeki bu property’leri güncellemeye izin verir ve bu güncellenen özellikler JavaFX Application Thread’inin kullanımı için servis edilir. Sizde kolayca bunları sahnedeki nesnelerinizin üzerlerine yazabilirsiniz.  Normalde Thread’lerle çalışırken bunları ana Thread’e taşımanın zorluklarını bilen bilir …

1.5 Task Class kullanımı

Evet tek atımlık silahımız olan Task<V> nesnemize geldi sıra. Adı çok geçti çok bahsettik şimdi bizzat kendinden bahsedelim. Evet tek atımlık dedim çünkü Failed durumuna yada Cancelled durumuna düştükten sonra tekrar eski durumuna geri döndürülerek kullanılamayan bir nesnedir. Eğer böyle bir isteğiniz varsa bunu yine aynı pakette bulunan Service nesnesini kullanarak halledebilirsiniz. 

Task<V> sınıfı Worker<V> interfacesini implemente etmiştir. Bu nedenle Worker<V> nesnesinin tüm özellik ve metodlarını içerir.  Yine Task<V> sınıfı Concurrency Framework’ünün bir parçası olan  FutureTask<V> sınıfından extend edilmiş. Bununla ilgili kazandığı özellikler için bu sınıf incelenebilir ve incelemeyi tavsiye ederim. Ben şunu anladım ki konunun tabiri caiz ise mutfağına hakim olursanız iş daha kolay çözülüyor yoksa geçici çözüm üretme konusunda uzman olunuyor sadece…

Yine FutureTask<V> ise Future<V> ve RunnableFuture<V> ve Runnable interfacelerini implemente etmiştir. Bu arada bir detay bildiğiniz gibi tek kalıtım alınır ama birden çok sınıfdan implementasyon yapılabiliyor.

Dolayısıyla Task<V> bu ağacın en son meyvesi olduğuna göre bunların tüm özelliklerine sahiptir. 

Şimdi hadi Task<V> nesnemizden extend edilen bir nesne oluşturalım ve artık konunun sonlarına doğru ulaşalım. 

Sınıfımıza baktığımızda Task<ObservableList<Long>> şeklinde extend edildiğini görüyoruz. Neden böyle peki ? bildiğiniz gibi bir değer döndüreceğiz bu dönecek değerin türü bu olduğu için böyle kullandık. Bulunan asal sayılar bir listeye eklenecek ve bu listede devamlı güncellenmeli diye de observable yi seçtik. Devamında belirttiğimiz limitler arasındaki sayıları tek tek kontrol edip içinde asal sayı olanları bizim listemize ekleyecek . Burada thread’imizi bir süre sleep() metodu ile uyutuyoruz bunun sebebi ise güya uzun bir işlem izlenimi oluşturmak.  Gerçek uygulamalar yaparken böyle birşeye ihtiyaç olmayacak ( intertnetten birşey download etmek vb..) .  Burada updateValue() ile ilgili bir açıklama yapalım isterseniz. 

Bir asal sayı bulunduğunda, sonuç listesi güncellenir. Yukarıdaki ifade, sonuç listesini değiştirilemeyen bir şekilde sarar. gözlemlenebilir liste ve istemci için yayınlar. Bu, size görevin kısmi sonuçlarını verir. Hızlı bir kısmi sonuç yayınlanma şeklidir. Eğer primitive bir sonuç dönecekse bu şekilde kullanmaya gerek yoktur. 

Evet bu bölümde bu kadar olsun part3 de buluşmak üzere…

 

 

Bir cevap yazın

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