» »

Kaj je narobe v tej kodi [Java]

Kaj je narobe v tej kodi [Java]

Bojevnik ::

Nekje v tej kodi bi morala biti napaka, toda jo ne najdem.

public class Miza {

    private String jed ="(prazno)";
    private boolean naVoljo = false;

    public synchronized void setJed(String jed)
    {
        while (naVoljo == true)
        {
            try
            {
                wait();
            }
            catch(Exception e) { e.printStackTrace(); }
        }
        this.jed = jed;
        naVoljo = true;
        notify();
    }

    public synchronized String getJed()
    {
        while (naVoljo == false)
        {
            try
            {
                wait();
            }
            catch(Exception e) { e.printStackTrace(); }
        }
       
        naVoljo = false;               
        notify();
        return jed;
    }

}


Po knjigi pišem programček ki naj bi sinhroniziral delovanje dveh niti.
Poleg te kode imam še dve niti natakar in gost. Natakar daje na mizo hrano gostu gost jo pa poje.
Problem je da stvar ne dela. Npr. se zgodi da natakar prinese naslednjo jed še preden je gost pojedel prejšno.

Tukaj sta še kodi za natakarja in gosta

public class Gost extends Thread {

    private Miza m;

    public Gost( Miza m )
    {
        this.m = m;
    }

    public void run()
    {
        String jed ="";
        do
        {
            try { sleep((int) Math.random() * 100); }
            catch(Exception e) { e.printStackTrace(); }
            jed = m.getJed();
            System.out.println("Pojedel: "+jed);
        } while(!jed.equals("sladica"));
    }

}


public class Natakar extends Thread {

    private Miza m;

    public Natakar( Miza m )
    {
        this.m = m;
    }

    @Override
    public void run()
    {
        String[] jedi = { "predjed", "juha", "glavna jed", "sladica" };

        for( int x=0; x<jedi.length; x++)
        {
            m.setJed(jedi[x]);
            System.out.println("Postregel: " + jedi[x]);

            try { sleep((int) Math.random() * 100); }
            catch(Exception e) { e.printStackTrace(); }
        }
    }

}

arjan_t ::

ti tu rabiš neki "exclusive" lock za mizo, ker synchronized ti bo samo naredilo da lahko samo Gost ali Natakar dostopata do set/get jed, ampak ko gost naredi getJed in spi lahko natakat prinaša na mizo neomejeno obrokov

edit: tvoj problem je v grobem producer-consumer (Producer-consumer problem) @ Wikipedia

Zgodovina sprememb…

  • spremenil: arjan_t ()

Bojevnik ::

Sej zaradi tega je v Miza tudi boolean naVoljo, ki naj bi delal to.

Genetic ::

Probaj dati println-e znotraj set in get metode, pred notify()

Bojevnik ::

Hvala dela.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[java]problem z Throws

Oddelek: Programiranje
221600 (1129) killa bee
»

[Android] Thread

Oddelek: Programiranje
81191 (968) Spura
»

[Android] Bluetooth aplikacija

Oddelek: Programiranje
51087 (950) marjan_h
»

[Android] Nov tip shranjevanja slike

Oddelek: Programiranje
142182 (1306) urosz
»

Java in pošiljanje elektronske pošte!!

Oddelek: Programiranje
51352 (1253) janez_janez

Več podobnih tem