[ maxmagnus2 @ 19.07.2007. 14:59 ] @
Poz,
napravio sam 3 klase:
1.klasa Banka sa int stanjem koji bi niti trebale da menjaju
2.klasa Korisnik koja je nit i koja treba da menja Banka.stanje preko odgovarajuceg
sinhronizovanog metoda. Korisnik ima 2 instance koje bi trebale da rade naizmenicno
(naizmenicno u smislu pvo jedna pa druga)
Ovo se ne desava iz meni nepoznatog razloga....
3. sluzi za pokretanje
kod:
Code:

public class Banka {
    int stanje=0;
    
    public synchronized void ulaganje(String za_ispis,int ulog){
        stanje=stanje+ulog;
        System.out.println(za_ispis+" "+stanje);    
    } //ulaganje_podizanje
}
*********************************************
public class Korisnik extends Thread{
    String ime;
    Banka B;
    int ulog;
    public Korisnik(String ime,Banka B,int ulog){
        this.B=B;
        this.ime=ime;    
        this.ulog=ulog;
    }//konstruktor
    public void run(){
        for(int i=0;i<10;i++)
            B.ulaganje(ime, ulog);        
    }//run
}
***********************************************

public class radna {
    public static void main(String[] args){ 
        Banka B=new Banka();
        Korisnik k1=new Korisnik("kor1**",B,10);
        Korisnik k2=new Korisnik("kor2",B,-10);
        k1.setPriority(Thread.MIN_PRIORITY);
        k2.setPriority(Thread.MAX_PRIORITY);
        k1.start();
        k2.start();
    }//main
}//class

Gde je greska tj kako da mi niti rade naizmenicno.
Nije htelo da radi ni pre nego sto sam dodelio prioritete a ni posto sam pokusao da tako resim problem....

[Ovu poruku je menjao maxmagnus2 dana 19.07.2007. u 16:25 GMT+1]
[ bgd2500 @ 19.07.2007. 16:42 ] @
Daj mu malo da dise.
Code:

public void run(){
  try {
    for(int i=0;i<10;i++) {
      B.ulaganje(ime, ulog);        
    }
    Thread.sleep(100);
  } catch (InterruptedException e) {
  }
}//run
[ Black @ 19.07.2007. 16:59 ] @
A kako se ta greska manifestuje?
[ maxmagnus2 @ 19.07.2007. 17:40 ] @
Mislim da bi ukoliko ovako postvim prioritete
trebala prvo da se izvsi sve iz niti koja koja ima veci prioritet?
[ Black @ 19.07.2007. 17:43 ] @
Hm.. ta operacija koju si im ti zadao zahteva vrlo malo vremena, tako da je vrlo moguce da se prvo izvrsi nit koju si prvo pokrenuo, a onda druga, odnosno da se niti paralelno ni ne izvrsavaju, jer se izvrsavaju prakticno trenutno.
[ maxmagnus2 @ 19.07.2007. 17:50 ] @
Da, u pravu si to se i dogodilo.
[ rj444 @ 20.07.2007. 17:26 ] @
Inace ako zelis da ti niti naizmenicno pristupaju banci, onda ne mozes da se oslonis na ovakav kod koji si napisao.
Moras eksplicitno da sinhronizujes niti da bi ostvario pristup u redosledu u kom zelis.

Sinhronizovane metode u Javi su implamentacija necega sto se zove monitor u teoriji konkurentnog programiranja. Ona ti obezbedjuje samo toliko da ne mogu dve niti da izvrsavaju metodu koja je sinhronizovana.

Da bi postigao to da one naizmenicno prisuptaju banci (ako je to potrebno) moras koristiti neki dodatni mehanizam.

Najjednostavnije je da to uradis pomocu semafora. Pogledaj malo o tome u teoriji konkurentnog programiranja, dokumentaciji Jave (klasa Semaphore)...

A mozes i napisati svoju klasu Semaphore pomocu monitora u Javi.
Code:

public class Semaphore {
    private int val;

    public synchronized void signal() {
        val++;
        if (val==1) notifyAll();
    }


    public synchronized void wait() {
        while (val == 0 ) {
             try { wait(); } catch (InterruptedException e) {}
        }
        val--;
    }

    public void init(int val) { this.val = val; }
}


Pozdrav
[ Mare34 @ 01.08.2007. 01:33 ] @
nije li dovoljno samo dodati metod yield() u while petlji posto scheduler nema sanse da scheduler promeni nit pre zavrsetka jedne iteracije while petlje s obzirom na kratkocu izvrsavanja iste?
[ rj444 @ 01.08.2007. 07:07 ] @
Nije dobro da tako da razmisljas kada pravis distribuiranu aplikaciju. Sve mora biti egzaktno i ne sme se zasnivati na verovatnoci da ce scheduler ili O.S. stici ili nece stici da nesto urade.
[ Mare34 @ 07.08.2007. 10:17 ] @
onda bi morale sve ostale niti da se blokiraju sem tekuce i da prilikom zavrsetka iteracije blokira trenutnu nit i oslobodi jednu od ranije blokiranih, a to bi moglo veoma lako da se uradi sa semaforima
[ rj444 @ 09.08.2007. 21:47 ] @
Ovo gore sto sam napisao i jeste semafor.