Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

wait() i notify() ne rade

[es] :: Java :: wait() i notify() ne rade

[ Pregleda: 1616 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

masterBG
Beograd

Član broj: 294554
Poruke: 15
*.dynamic.sbb.rs.



+3 Profil

icon wait() i notify() ne rade01.12.2011. u 00:46 - pre 150 meseci
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);
            }
            
        
        

    }

}
 
Odgovor na temu

Dejan Lozanovic
Dejan Lozanovic
Beograd

Član broj: 691
Poruke: 2325
...cust-194.exponential-e.net.

Jabber: null@elitesecurity.org
Sajt: speedy-order.com


+75 Profil

icon Re: wait() i notify() ne rade01.12.2011. u 11:38 - pre 150 meseci
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
 
Odgovor na temu

masterBG
Beograd

Član broj: 294554
Poruke: 15
*.dynamic.sbb.rs.



+3 Profil

icon Re: wait() i notify() ne rade01.12.2011. u 11:52 - pre 150 meseci
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]
 
Odgovor na temu

grujicd
Dejan Grujic
Cogin
Beograd

Član broj: 24171
Poruke: 101
89.216.32.*

Sajt: www.cogin.com


+9 Profil

icon Re: wait() i notify() ne rade01.12.2011. u 13:41 - pre 150 meseci
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.
 
Odgovor na temu

masterBG
Beograd

Član broj: 294554
Poruke: 15
*.dynamic.sbb.rs.



+3 Profil

icon Re: wait() i notify() ne rade01.12.2011. u 13:46 - pre 150 meseci
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...
 
Odgovor na temu

grujicd
Dejan Grujic
Cogin
Beograd

Član broj: 24171
Poruke: 101
89.216.32.*

Sajt: www.cogin.com


+9 Profil

icon Re: wait() i notify() ne rade01.12.2011. u 14:21 - pre 150 meseci
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.
 
Odgovor na temu

masterBG
Beograd

Član broj: 294554
Poruke: 15
*.dynamic.sbb.rs.



+3 Profil

icon Re: wait() i notify() ne rade01.12.2011. u 14:31 - pre 150 meseci
hvala ti puno... sad cu da isprobam...

EDIT: Radi sve... Hvala ti puno... Spasio si me.
 
Odgovor na temu

[es] :: Java :: wait() i notify() ne rade

[ Pregleda: 1616 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.