Java Temelleri : Java Threading

advertisement
Java Threading - MultiThreading
Java Threading - MultiThreading
Basitçe Thread, bir programın paralel olarak çalışan ve biribirine bağlımlı ya
da bağımsız işlemler yapan alt parçacıklarına verilen isimdir.
Bir program içinde birçok thread oluşturulabilmektedir. Örneğin eş zamanlı olarak bir thread'de 1'den 1000000'a kadar sayıları
saydırırken, bir yandan 1000000'dan 1'e sayıları büyükten küçüğe saydırabilmekteyiz. Hatayımızda threadler olmasaydı
ikincisayma işleminin başlaması için ilkinin bitmesi beklenmek zorundaydı.
Thread Oluşturma Şekilleri :
1. İşletim sistemi tarafından oluşturulan thread
2. Kullanıcı tarafından oluşturulan threadler.
3. Hibrit threadler
Thread Oluşturma Şekilleri :
1. Çekirdek Uzayında Gerçeklenen Threadler : Thread tablosu kernel’de (işletim sisteminde) yer alır. Hangi thread’in
çalışacağına kernel (çekirdek) karar verir. Yeni thread oluşturmak için kernel’da sistem çağrısı yürütülür.
2. Kullanıcı Uzayında Gerçeklenen Threadler : Kernel, threadlerden haberdar değildir, bu nedenle threadleri desteklemeyen
işletim sistemlerinde bile kullanıabilir. Her process’in (programın) ayrı thread tabloları bulunmaktadır. Bu sayede her processte
farklı iş sıralama algoritmaları kullanılabilmektedir.
3. Hibrit Threadler : Çekirdek ve kullanıcı düzeyinde threadler vardır, ancak kernel sadece kernel düzeyindeki threadlerden
haberdardır. Bir kernel düzeyi thread üzerinde birden fazla kullanıcı düzeyi thread sıra ile çalışır.
Mutex-Exclusion
Mutex-Exclution kavramı, birden fazla threadin eş zamanlı güvenli çalışmasını sağlamak anlamına gelmektedir. Birden fazla thread
eş zamanlı olarak çalışırken çakışmalar gerçekleşebilmektedir. Bunu önleyebilmek için yazılım dilleri bazı kontrollerle bu çakşmayı
önlemektedir.
Cross-Threading
Multi-Threading uygulamalarında threadlerin birbirleriyle haberleşmesini sağlayan yapıdır. Örneğin eş zamanlı aynı control üzerinde
birden fazla thread işlem yapamazken bu yöntem sayesinde bu işlemi gerçekleştirebilmesi sağlanabilmektedir.
Bu kadar teorik açıklamadan sonra Thread uygulamalarımıza başlayalım.
İlk örneğimiz tek bir thread oluşturma ve kullanma işlemidir.
public class Hesap extends Thread{
private int sayac = ;
public void run(){
while(true){
System.out.println(this.sayac++);
}
}
}
Hesap sınıfımız Thread sınıfından türetilmiştir. Bu işlem, thread olarak kullanılabileceğini belirtmektedir. Şimdi Hesap sınıfından
bir nesne oluşturup projemizi çalıştıralım.
public static void main(String[] args) throws InterruptedException {
Hesap hesap1 = new Hesap();
hesap1.start();
}
Kodumuz sonsuz döngüye girdiği için kodumuzun çalışmasını durdurduk ve durdurduğumuz noktada ekran görüntüsünü aldık.
www.dersmax.com
Java Threading - MultiThreading
1
Java Threading - MultiThreading
Şimdi eş zamanlı çalışan birden fazla thread oluşturma işlemini inceleyelim.
Önceki örneğimizde tek thread oluştururken Thread sınıfını genişletmiştik. Şimdi ise java.lang.Runnable Interface'inin kalıtımını
alarak işlem yapıyoruz. Bu yöntem, thread oluşturmak için alternatif bir yöntemdir. Sınıflararası kalıtım verilmesi gereken
durumlarda, Java sınıfları tek bir sınıftan kalıtım alacağı için bazen Thread sınıfından kalıtım almak imkansız hale gelebilmektedir.
Bu durumlarda Runnable interface'i kurtarıcı olarak imdadımıza yetişmektedir.
Örnek uygulamamızda Islem isminde bir sınıfımız olsun ve bu sınıfta sonsuz döngüde alt alta işlem adı ve kaçıncı kez döngüde
döndüğü bilgileri gösterilsin.
Runnable Interface'inin run methodu asıl işlemimizi yapan methoddur.
public class Islem implements Runnable{
private int sayac = ;
private int islemNo;
public Islem(int islemNo){
this.islemNo = islemNo;
}
@Override
public void run() {
while(true){
System.out.println("Islem " + this.islemNo + " : " + this.sayac++);
}
}
}
Eş zamanlı 2 işlem çalıştıracağımız için islemNo değişkeni ile hangi işlemde hangi değerin çalıştığını takip edebiliriz.
Şimdi bu kodumuzu denemek için main methoduna gidelim.
public static void main(String[] args) throws Exception {
Islem islem1 = new Islem(1);
Islem islem2 = new Islem(2);
Thread thread1 = new Thread(islem1);
Thread thread2 = new Thread(islem2);
thread1.start();
thread2.start();
}
Önceki uygulamamızda Hesap sınıfı Thread'den kalıtım aldığı için run (ya da start) diyerek hemen çalıştırdık. Fakat burada Islem
sınıfımızdan oluşturacağımız değişkeni önce Thread olarak tanımlamamız gerekmektedir. Bunun için 2 tane Thread
oluşturuyoruz.
www.dersmax.com
Java Threading - MultiThreading
2
Java Threading - MultiThreading
Şimdi main methodunu çalıştıralım.
Kodumuz sonsuz döngüye girdiği için herhangi bir yerinde durdurup ekran çıktısı aldım. Gördüğünüz gibi Islem2 22167'deyken
Islem1 25188. döngüde bulunmakta ve belli bir sistem ile çalışmaktadırlar.
Kaynaklar
http://www.yazilimdevi.com/Makaleler-760-java-threading--multithreading.aspx
http://www.yazilimdevi.com/yazilimdevi/Makaleler-759-java-threading.aspx
www.dersmax.com
Java Threading - MultiThreading
3
Download