[ masterBG @ 01.12.2011. 00:46 ] @
Pozdrav,

u mom programu notify() ne probudi wait()... Trebao bi da uspava prvu nit i da je sledeca probudi i da ostale niti ne rade nista pametno... Molim za pomoc, ovo mi je prvi post ovde... Potrosio sam dosta vremena pokusavajuci da u literaturi pronadjem resenje, ali nije dalo rezultata... Hvala unapred...

Code:

class nitv extends Thread{
    public synchronized void zauzmi(){
        
        try {
            System.err.println("Uspavano!");
            wait();
            System.out.println("Probudjeno!");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("Gotovo!");
    }
    
    public synchronized void oslobodi(){
        System.out.println("Probamo!");
        notify();
    }
    public synchronized void run(){
        if(primer4.k==1){
            zauzmi();
        }else{
            oslobodi();
            
        }    
    }
    
    
}

public class primer4 {

    static int k=0;
    static int i=0;
    public static void main(String[] args) {
        
        Thread nit;
        
            while(k<6){
                k++;
                nit = new nitv();
                nit.start();
                System.out.println("k = "+k);
            }
            
        
        

    }

}
[ Dejan Lozanovic @ 01.12.2011. 11:38 ] @
prvo, nemoj da koristis notify, nego notifyAll. Drugo wait i notofyAll treba da se koriste unutar neke while petlje.

http://docs.oracle.com/javase/...ial/concurrency/guardmeth.html
[ masterBG @ 01.12.2011. 11:52 ] @
I dalje ne radi... Isto se zaglavi posle wait...


Code:
class nitv extends Thread{
    synchronized void zauzmi(){
        
        try {
            
            while(primer4.done){
                            System.err.println("Uspavano!");
                            wait();
                        }
            System.out.println("Probudjeno!");
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("Gotovo!");
               
                     
    }
    
    synchronized void oslobodi(){
        System.out.println("Probamo!");
                primer4.done=false;
        
                notifyAll();
                
        
    }
    public synchronized void run(){
        if(primer4.k==1){
            zauzmi();
                        
        }else{
            oslobodi();
            
        }
        
        
    }
    
    
}

public class primer4 {

    /**
     * @param args
     */
    static int k=0;
    static int i=0;
        static boolean done=true;
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Thread nit;
        
        
            while(k<6){
                k++;
                nit = new nitv();
                nit.start();
                System.out.println("k = "+k);
            }
            
        
        

    }

}


I ako mi se dobro cini notifyAll ne ide u petlju..

Code:
public synchronized notifyJoy() {
    joy = true;
    notifyAll();
}


[Ovu poruku je menjao masterBG dana 01.12.2011. u 13:29 GMT+1]
[ grujicd @ 01.12.2011. 13:41 ] @
Obrati pažnju na dve stvari. Prvo, ni wait ni notify neke globalne metode, već su vezani za jedan konkretan objekat. Ako pišeš wait i notify samo tako kao kod tebe, onda se oni naravno primenjuju nad "this". Ako uradiš wait nad jednim objektom, a notify nad drugim, ništa se neće desiti. U tvom primeru imaš 6 objekata - u prvom pozivaš samo wait, a u ostalima samo notify. Svi ti pozivi nemaju veze jedni sa drugim i neće se "mečovati".

Druga stvar je da notify gleda da li neki thread trenutno čeka u wait, i ako ga ima budi ga i predaju mu kontrolu. Ako ni jedan thread ne čeka na wait, taj notify se gubi, nigde se ne beleži da se desio. Tako da može da se desi da ti prođe notify još pre nego što je drugi thread stigao do wait - taj notify se izgubi i onda wait čeka beskonačno. To je sasvim moguća situacija u multithread programiranju, čak i na ovakvom naizgled jednostavnom primeru gde prvo pokrećeš thread koji radi wait. Nemaš nikakvu garanciju da će se on stvarno izvršiti pre ovih drugih threadova.
[ masterBG @ 01.12.2011. 13:46 ] @
Citat:
grujicd: Obrati pažnju na dve stvari. Prvo, ni wait ni notify neke globalne metode, već su vezani za jedan konkretan objekat. Ako pišeš wait i notify samo tako kao kod tebe, onda se oni naravno primenjuju nad "this". Ako uradiš wait nad jednim objektom, a notify nad drugim, ništa se neće desiti. U tvom primeru imaš 6 objekata - u prvom pozivaš samo wait, a u ostalima samo notify. Svi ti pozivi nemaju veze jedni sa drugim i neće se "mečovati".

Ja sam na ovo sumnjao od pocetka, ali ne znam kako da resim to... Tacnije, ne znam kako da napravim npr. 6 niti a da sve spada pod jedan objekat...
[ grujicd @ 01.12.2011. 14:21 ] @
Trebaju ti 2 klase. Jedna će da bude izvedena iz Thread, kao i sada, i služiće da pomoću nje praviš nove thread-ove. Imaćeš 6 instanci te klase, kao i sada. A u drugu klasu prebaci ovo zauzmi() i oslobodi(), napravi samo jednu instancu te klase, i prosledi je kroz konstruktor svim objektima one prve klase.

Ili još prostije i dovoljno za ovakav primer, dodaš statičku promenljivu u "nitv" klasu, može da bude bilo šta, npr:

Code:

private static Object kljuc = new Object();


Onda promeniš zauzmi() i oslobodi() metode da ne budu synchronized, već da se sinhronizacija radi sa tim ključ objektom. Takođe i wait i notify treba da rade sa tim objektom. Ovako nešto:

Code:

    public void oslobodi(){
        synchronized( kljuc )
        {
            System.out.println("Probamo!");
            kljuc.notify();
         }
    }


Slično tako promeniš i onaj drugi metod. Tako ćeš imati 6 threadova, ali će sinhronizacija i wait i notify svi raditi nad jednim jedinim objektom.
[ masterBG @ 01.12.2011. 14:31 ] @
hvala ti puno... sad cu da isprobam...

EDIT: Radi sve... Hvala ti puno... Spasio si me.