7 Mart 2013 Perşembe

Multithreading - Ufak bir not

Şimdi şöyle bir şey var; İnternette multithreading ile ilgili birçok örnek ve gerek detaylı gerek kısa birçok da ders var.
Bunların bize bir şeyler öğrettiği kesin. Thread nasıl başlatılır, yararları nedir, ne zaman kullanılır vs.
Ama geçenlerde multithreading olayını anlamak için yapmak istediğim bir deneme projesinde takılı kaldım.

Deneme projem iki sınıftan oluşuyordu. Her birinin içinde de birden fazla metot bulunuyordu. Bildiğiniz gibi, bir thread, ilk başta run() metodunu arar.
public class ThreadDeneme implements Runnable{
 public void run(){
//çalışacak kod 
}
}
Ama benim istediğim bundan biraz farklıydı. Sadece run içindeki kodu çalıştırmak istemiyordum.  Ama thread de sadece bunu çalıştıracaktı.
İstersem, bu run() metodunun içinden farklı metotları çağırabiliyorum tabi ki. Burada bir sorun yok. Şu şekilde mesela;

public class ThreadDeneme implements Runnable{
 public void run(){
//bu sınıftaki başka bir metot
yeniMetot(); 
}
}
Bu, run metodunun içinden yeniMetot'u çağıracak ve böylece yeni metot, farklı bir thread içinden çalışıyor olacak.  Ama eğer ben tüm metotların farklı threadler içerisinde çalışmasını istersem bunu bu şekilde yapamıyorum. Tabi ki run() metodu içerisinde istediğim kadar metot çağırabilirim. Hatta başka bir sınıf nesnesi oluşturup o sınıftaki bir yöntemi de çağırabiliyorum. Ama ya birden fazla yöntemi multithreading olarak çağırmak istersem ve bu metotların birbirinden farklı bir şekilde çalışmasını istersem?
Yani, metotBir ve metotIki'yi farklı zamanlarda da çağırmak istersem ne olacak? Bu durumda run() metodunun içini program çalışırken değiştiremediğim için, istediğim gibi bir şey mümkün değil. İkisini birden çalıştırmaya razı olacaktım mesela. Ki, bu ideal değil.
Bir thread'i nasıl başlatıyoruz? Bildiğim kadarıyla şöyle başlatabiliyorduk:
Thread t1 = new Thread(SınıfAdı);
İşte burada sadece tun() metodu içindeki yeri çalıştıracak. Ben de bu durumda ya metotBir ya da metotIki'yi seçecektim. Ama biraz araştırdıktan sonra bir thread oluşturmanın tek yolunun bu olmadığını fark ettim. Yukarıdaki satırda Thread'in istediği aslında şu;
Thread t1 = new Thread(Bir Runnable sınıf);
O halde, anonim bir Runnable sınıfı yaratabilir ve içine de istediğim bir metodu koyabilirim:
Thread t1 = new Thread(new Runnable(){ 
public void run(){
sinifNesnem.metotBir(parametrelerim); 
}
});
t1.start();
Böylece istediğim sınıfın istediğim metodunu, istediğim anda başka bir thread içinden çağırabiliyor olacağım. Projemi şöyle yaptım:
SınıfBir sBir = new SınıfBir();
Sınıfİki sİki = new SınıfIki();
Thread t1 = new Thread(sBir);
 Thread t2 = new Thread(new Runnable(){
public void run() {
System.out.println("t2 başlıyor... "+ System.currentTimeMillis());
sİki.metotBir();
}
});
static Thread t3 = new Thread (new Runnable(){
public void run(){
                        System.out.println("t2 başlıyor... "+ System.currentTimeMillis()); 
sİki.metotİki();
}
});

Sonra da geriye bunları başlatmak kalıyor. Onu da t1.start(); diyerek başlatabiliyorum.
 
 










Devamını oku...