Nüve Forum

Nüve Forum > kütüphane > Bilim ve Teknoloji > Bilgisayar > Yazılım > Java > Sleeping Barber (Uyuyan Berber)

Java hakkinda Sleeping Barber (Uyuyan Berber) ile ilgili bilgiler


Soru ; Bir berber dükkanı bekleme odası, n adet bekleme sandalyesi ve bir de berber koltuğundan oluşmaktadır. Eğer traş edilecek müşteri yoksa berber uyumaktadır. Eğer bir müşteri geldiğinde bütün bekleme

Like Tree3Likes
  • 3 Post By OnR

Cevapla

 

LinkBack Seçenekler Stil
  #1  
Alt 27.11.07, 09:53
OnR - ait kullanıcı resmi (Avatar)
OnR OnR isimli Üye şimdilik offline konumundadır
Administrator
 
Üyelik tarihi: Apr 2006
İletiler: 931
Blog Başlıkları: 2
OnR isimli üye tecrübe puanını kapatmıştır.
Standart Sleeping Barber (Uyuyan Berber)

Soru ;
Bir berber dükkanı bekleme odası, n adet bekleme sandalyesi ve bir de berber koltuğundan oluşmaktadır. Eğer traş edilecek müşteri yoksa berber uyumaktadır. Eğer bir müşteri geldiğinde bütün bekleme sandalyeleri dolu ise müşteri dükkanı terk eder. Eğer müşteri geldiğinde berber başka bir müşteriyi traş ediyorsa, buna karşılık boş bekleme sandalyesi varsa müşteri kuyruğa girip sandalyeye oturur. Berber uyuduğu zaman müşteri berberi uyandırmaktadır. Java synchronization yaklaşımını kullanarak bu işlemleri koordine eden bir Java programı yazınız. Kritik alanlara giriş gerekirse semafor kullanınız.



Çözüm ;

BerberDukkani.java

Kod:
import java.util.concurrent.Semaphore;

public class BerberDukkani
{

    private Semaphore berberSandalyesi; 
    private Semaphore sandalyeler;         
    private Semaphore berber;    

    private int bekleyenMusteriler;    
    private final int sandalyeSayisi; 

    private static final int kesmeZamani = 1000; 


    public BerberDukkani(int sandalyeSayisi)
    {

        berberSandalyesi = new Semaphore(1, true);
        sandalyeler = new Semaphore(0, true);
        berber = new Semaphore(0, true);

        this.sandalyeSayisi = sandalyeSayisi;
        bekleyenMusteriler = 0;

        berberHazir();
    }



    private void berberHazir()
    {
        System.out.println("Berber bosta , uyuyor.");
        berber.release(); 
        sandalyeler.release();

    }

    public void musteriHazir(Musteri c)
    {
        System.out.println(c + " numara sac kestirmek istiyor.");

        if(berberSandalyesi.availablePermits() <= 0)
            musteriOturdu(c);

        if(c.kestirmekIstiyor())
        {
            try
            {
                
                berberSandalyesi.acquire();
                tras(c);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }


    public void musteriOturdu(Musteri c)
    {


        if(bekleyenMusteriler < sandalyeSayisi)
        {

            try
            {
                bekleyenMusteriler++;
                System.out.println(c + " numara sandalyeye oturdu ve bekliyor. " + bekleyenMusteriler + " bekleyen musteri var.");

                sandalyeler.acquire();
            }
            catch (InterruptedException e)
            {

                e.printStackTrace();
            }
        }
        else
        {
            System.out.println(c + " numara giremedi. Cunku dukkan dolu.");
            c.ayrilmakIstiyor();
        }


    }


    public void tras(Musteri c)
    {
        
        if(bekleyenMusteriler > 0)
            bekleyenMusteriler--;

        try
        {
            berber.acquire(); 
            System.out.println(c + " numara berberi uyandirdi , sac kestiriyor.");

            
            Thread.sleep(kesmeZamani);
        }
        catch (InterruptedException e1)
        {

            e1.printStackTrace();
        }
        System.out.println(c + " numara sacini kestirdi ve dukkandan ayrildi.");
        berberSandalyesi.release(); 
        berberHazir(); 
            }

    public static void main(String[] args)
    {
    
        int musteriSayisi = 100;

        BerberDukkani sh = new BerberDukkani(5);

        Thread[] cust = new Thread[musteriSayisi];

        for(int i=0; i<musteriSayisi; i++)
            cust[i] = new Musteri(sh, "" + i);

        for(int i=0; i<musteriSayisi ; i++)
            cust[i].start();
    }





}
Musteri.java


Kod:
import java.util.Random;


public class Musteri extends Thread
{
    private String isim;             
    private BerberDukkani dukkan;         

    private Random r;                

    private boolean kestirmekIstiyor;    


    public Musteri(BerberDukkani dukkan, String isim)
    {
        this.isim = isim;
        this.dukkan = dukkan;
        kestirmekIstiyor = true;

        r = new Random();

    }


    public void run()
    {
        bosZaman();
        dukkan.musteriHazir(this);

    }


    public boolean kestirmekIstiyor()
    {
        return kestirmekIstiyor;
    }


    public void ayrilmakIstiyor()
    {
        kestirmekIstiyor = false;
    }

    
    public void bosZaman()
    {
        try
        {
            this.sleep(Math.abs(r.nextInt(100000)));
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
    }


    public String toString()
    {
        return isim;
    }


}
Alıntı ile Cevapla
Cevapla

Tags
(uyuyan, barber, berber), sleeping

Seçenekler
Stil

Yetkileriniz
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Açık
[IMG] Kodları Açık
HTML-KodlarıKapalı
Trackbacks are Açık
Pingbacks are Açık
Refbacks are Açık



Bütün zaman ayarları WEZ +2 olarak düzenlenmiştir. Şu anki saat: 13:44 .