Notifyall – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Notifyall – Java – Fórum – Programujte.comNotifyall – Java – Fórum – Programujte.com

 

jirka44
~ Anonymní uživatel
1 příspěvek
14. 5. 2012   #1
-
0
-

Mam problem s nasledujicim kodem:

public class CekaciTrida extends Thread {
    @Override
    synchronized public void run() {
        System.out.println("ceka");
        try {
            wait();
        } catch (InterruptedException ex) {
            Logger.getLogger(CekaciTrida.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println("probuzek - konci");
       
    }//edn of method
}

//---------------------------------------------------------------------------------------------------------

public class ProbouzeciTrida extends Thread {
    @Override
    synchronized public void run() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException ex) {
            Logger.getLogger(ProbouzeciTrida.class.getName()).log(Level.SEVERE, null, ex);
        }
        notify();
        System.out.println("probudil jsem ho");

    }
}

//------------------------------------------------------------------------------------------------------------------------------------



synchronized public static void main(String[] args) {
        // TODO code application logic here
       
        CekaciTrida cekaci = new CekaciTrida();
        ProbouzeciTrida probouzeci = new ProbouzeciTrida();
       
       
      
       
        cekaci.start();
        System.out.println("kurde");
        probouzeci.start();
       
    }

Proc se mi prvni vlakno neprobudi z wait, ikdyz volam notifyall? Diky.

Nahlásit jako SPAM
IP: 147.32.185.–
zlz
~ Anonymní uživatel
634 příspěvků
15. 5. 2012   #2
-
0
-

Protože wait(), notify() a notifyAll() operují jen s objektem, pro který byly zavolány. Tj. wait() na jednom objektu nereaguje na notify()/notifyAll() na jiném objektu.

Ty tam v podstatě máš cekaci.wait() a probouzeci.notify(), proto to nefunguje.

Můžeš to upravit třeba takhle:

class CekaciTrida extends Thread {
    @Override
    synchronized public void run() {
        System.out.println("ceka");
        try {
            wait();
        } catch (InterruptedException ex) {
            Logger.getLogger(CekaciTrida.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println("probuzen - konci");
    }
}

class ProbouzeciTrida extends Thread {
    private CekaciTrida ct;

    public ProbouzeciTrida(CekaciTrida ct) {
        this.ct = ct;
    }

    @Override
    synchronized public void run() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException ex) {
            Logger.getLogger(ProbouzeciTrida.class.getName()).log(Level.SEVERE, null, ex);
        }

        synchronized (ct) {
            ct.notify();
        }
        System.out.println("probudil jsem ho");
    }
}
...

CekaciTrida cekaci = new CekaciTrida();
ProbouzeciTrida probouzeci = new ProbouzeciTrida(cekaci);

Takže to ve výsledku udělá cekaci.wait() a cekaci.notify().

Případně s "externím" objektem pro signalizaci (což může být lepší řešení, ale to asi ještě nemusíš řešit):

Object sig = new Object();
CekaciTrida cekaci = new CekaciTrida(sig); // ... sig.wait();
ProbouzeciTrida probouzeci = new ProbouzeciTrida(sig); // ... sig.notify();
Nahlásit jako SPAM
IP: 80.188.216.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý