Merhaba ,
Birlikte Threadleri sırayı sokma için en mantıklı örneği birlikte yapıcaz , threadleri iyi anlamak için şöyle bir örnek düşünelim , banka hesap numaranız var ve bundan belirli bakiyenizden para çekiyorsunuz.Siz ATM den para çekerken aynı milisaniye içerisinde sizin hesabınıza erişim yapapilen eşiniz,dostunuz internet bankacılığı aracılığı ile alışveriş yapmakta. Banka öncelikle hangi işlemi öne alacak? 1000 liralık hesabınızdan iki kişiden 550 TL lik işlem yaparsa banka 100 lira zarara girecektir. İşte kilit nokta burası , eğerki threadleri programınızda doğru yerlerde kullanmazsanız yapılacak işlemler karışabilir ve istenmeyen sonuçlar çıkabilir.
Thread, javanın bize sunduğu multi process işlemidir. Aynı anda birden fazla işlemi çalıştırabilmektedir. synchronized ise bunları sıraya sokar ve karışıklığı engeller , az önce söylediğim örnek beraber yapalım ..
// Öncelikle banka hesabımızdaki bakiyeyi oluşturuyoruz
public class BankHesap {
private double bankHesap;
public BankHesap(double bankHesap) {
this.bankHesap = bankHesap;
}
synchronized public void paraCek(String kim , double tutar){
if (tutar > this.bankHesap) {
System.out.println(kim+ " Hesapta yeterli bakiye yok ");
System.out.println("Çekilmek istenen tutar = " + tutar);
System.out.println("Bakiye = " + this.bankHesap);
}else{
bankHesap -= tutar;
System.out.println(kim + " " + tutar + " Para çekti kalan bakiye = " + this.bankHesap);
}
System.out.println(" ");
}
}
// Daha sonra işlemleri sıraya sokacak threadler ile işlemleri kolaylaştırıyoruz
public class thClass extends Thread{
private BankHesap baHesap;
private String kim;
private double tutar ;
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
baHesap.paraCek(kim, this.tutar);
}
public thClass(BankHesap baHesap,String kim,int tutar) {
this.baHesap=baHesap;
this.kim=kim;
this.tutar=tutar;
}
}
// Daha sonra main metotu ile işlemi tamamlıyoruz
import java.util.Scanner;
public class ParaCek {
public static void main(String[] args) {
int bakiye ;
Scanner scanner = new Scanner(System.in);
System.out.println("Bu dönemki bakiye = ");
bakiye = scanner.nextInt();
BankHesap hesap=new BankHesap(bakiye);
thClass t1=new thClass(hesap, "Merve", 600);
thClass t2=new thClass(hesap, "Görkem", 330);
thClass t3=new thClass(hesap, "Tolga", 233);
thClass t4=new thClass(hesap, "Ali ", 444);
thClass t5=new thClass(hesap, "Veli", 66);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
}
}
Unutulmaması gereken diğer nokta Thread sınıflardan extend edilen veya runnable sınıfını implement ettiğimiz zaman run metotunu override etmemiz gerekir.
Hiç yorum yok:
Yorum Gönder