31 Ocak 2015 Cumartesi

Thread

        S.a. Arkadaşlar,
        Bugünkü konumuz threadlar olacak. Elimizden geliğince sade bir şekilde anlatmaya gayret edeceğiz. Muhakkak hepimizin en azından bir kaç defa duyduğunu düşündüm bir kavram , fakat tam olarak nedir nasıl çalışır onu irdelemeye çalışacağız. Peki nedir thread ? Threadler kısaca çalışan iş parçacıklarıdır. Java'nın çoklu thread özelliği ile işlemci yönetimi sağlayabiliriz. Peki bu işlemci yönetiminin bize ne gibi faydaları olur derseniz işlemcinin performansından en iyi şekilde yararlanmak da diyebiliriz, fakat bunu yaparken sistemin çalışmasına etki edebileceğimizi de unutmamak gerekir. İyi uygulanmadığında başımızı ağrıtacağı da kesindir. Şimdi gelelim threadlerin kullanım şekline. Threadler 2 şekilde kullanılabilirler. Bunlardan biri kalıtım diğeri ise interface ile implement etmektir. Fakat hangisi daha uygun diye sorarsanız , bildiğimiz gibi java çoklu kalıtım izin vermediği için eğer biz class Sinif extends Thread yaparsak, kalıtım hakkımızı böyle  doldurmuş olacağız. Fakat eğer biz class Sinif implements Thread yaparsak , burada herhangi bir kısıtlama yoktu hatırlarsınız. birden fazla interface de implement edilebiliyordu. Şimdi yavaş yavaş kodlamamıza başlayıp eksik gördüğümüz yerleri tamamlamaya çalışalım

public class CoolThread extends Thread {

@Override
public void run() {
System.out.println("The job is starting!");
}

public static void main(String[] args) {
CoolThread t = new CoolThread();
Thread t2 = new Thread(new CoolThread());
                t2.run();
                //çalışan threadm canlı değildir. Canlanması için
                //start edilmeye ihtiyacı vardır
}
}

//bu 2 kod arasında çalışma mantığı olarak hiç bir fark yoktur
//fakat üstteki kod kalıtım yardımıyla çalışmaktadır
//aşağıdaki kod ise interface uygulayarak çalışmak
//yukarıda da belirttiğimiz gibi tercihimiz alttaki koddan yanadır.
//aşağıdaki koddan devam edeceğimiz için o kodu geliştirdik

class MyRunnableMoreThread implements Runnable {

@Override
public void run() {
System.out.println("run method()");
for (int i = 0; i < 10; i++) {
String name = Thread.currentThread().getName();
long id = Thread.currentThread().getId();
System.out.println("index:" + i + " " + name + " " + id);
}
}

}

public class RunnableMoreThreadTest {

public static void main(String[] args) {

MyRunnableMoreThread myRunnable = new MyRunnableMoreThread();
Thread t1 = new Thread(myRunnable);
Thread t2 = new Thread(myRunnable);
Thread t3 = new Thread(myRunnable);

t1.setName("First");
t2.setName("Second");
t3.setName("Third");
             
                //start threadi başlatır.
                t1.start();
t2.start();
t3.start();
                //t1.run();
                //fakat run start olmadan da çalışır ama thread hala pasiftir
                //çünkü run da bir metod olduğundan referans ile çağırabiliriz
}
}

     Burada çaktığımız değişkenlik gösterir. Bunun sebebi hangi threadin hangi anda çalışacağının belli olmamasıdır. Yani thread1 çalışıyorken bir anda thread 2 onu keser , tekrar thread 1/3 thread2'yi keser ve bu şekilde devam edebilir, fakat burada önemli olan her threadin görevinin tamamlayıp sonlanacağıdır. Threadlerle ilgili bir kavramları göreceğiz. Bu sayede threadleri yönlendirebiliriz. Bu yönlendirmeleri yapabileceğimiz bir kaç kavram ve metod üzerinde duralım.

New: Threadin oluşturulduğu fakat henüz çalışmaya başlamadığı durumdur
Runnable: Threadin çalışmaya başladığı andır. Thread artık aktiftir.
Waiting: Threadin beklemede olduğu kısımdır. Aktiftir fakat çalışmaz.
Blocked: Senkronize edilmiş bir metodda çalışan thread dışındaki threadler askıya alınır.
Terminatted: Threadin faaliyetinin son bulduğu durumdur.

     Kavramlara kısaca baktık, şimdi de bazı metodlara bakıp yazımızı sonlandıralım.

Sleep: Belirtilen süreye kadar metodu bekletir. Süre bittiğinde tekrar çalışacağının garantisi yoktur. Overload metodları vardır. Parametre almayan metodu Exception fırlatır. O nedenle bu hatayı yakalamamız gerekir yoksa program hata verecektir. Statictir.

Yield: Threadlere öncelik verir. Fakat bu öncelik sıralamasının yine de bir garanti durumu yoktur. Statictir. Genelde pek kullanılmaz. Debug ve tet amaçlı kullanılabilir.

Join: Diğer 2 mtedoun aksine static değildir. Overload metodları vardır. Parametre almayan metodu exception fırlatır. Burada ise 1 metod çalışırken diğer metodlar bloklanır. Bir tür senkronize vardır.




Hiç yorum yok:

Yorum Gönder