Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno java ukončení uspaného vlákna

Ahoj, děláme v javě jeden prográmek ve škole a mám problém s ukončením uspaného vlákna...hází to vyjímku "Exception in thread "AWT-EventQueue-0" java.lang.IllegalMonitorStateExcept

mám to takto:

první třída:

Vlakno vln = new Vlakno();

vln.start();
...
...
...
vln.konec=1;
vln.notify();

a třídu s vláknem:

public class Vlakno extends Thread {

    Parser prs = new Parser("něco1", "něco2");
    
    public byte konec = 0;

    public void run() {
        while (konec == 0) {
            try {
                if (prs.parsuj() == 1) {
                    System.out.println("ok");
                    Thread.sleep(60000);
                } else {
                    System.err.println("Chyba");
                    return;
                }
            } catch (InterruptedException ex) {
                Logger.getLogger(Vlakno.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
return;
    }
}

Když vlákno spí, tak ho musím nejdříve probudit, tak zavolám notifyall a spadne to...neví co s tím?Když jen dám pomocí proměnné "konec" příznak na ukončení a nedám notiffy, tak musím čekat až se vlákno probudí, zkontroluje podmínku a pak se normálně ukončí...jenže já potřebuji ukončení hned...a né čekat...

děkuji za pomoc...

Předmět Autor Datum
na objekte mozes zavolat wait/notify/notifyAll ak vlastnis jeho lock, inka dostanes IllegalMonitorSt…
emem 13.04.2012 09:08
emem
díky moc..vlákno se opravdu ukončí... ale teď je problém ho znova nahodit... když dám po ukončení…
n.u.r.v. 13.04.2012 10:47
n.u.r.v.
Nastartovat thread sa da len raz, tu je javadoc ku start metode: It is never legal to start a thre… poslední
emem 13.04.2012 11:14
emem

na objekte mozes zavolat wait/notify/notifyAll ak vlastnis jeho lock,
inka dostanes IllegalMonitorStateExcept, cize takto nejako:

synchronized(vln) {
    vln.notify();
}

ak potrebujes cakat vo vlakne na prebudenie (s timeoutom 60 sekund),
tak nie cez Thread.sleep ale cez wait()

if (prs.parsuj() == 1) {
    System.out.println("ok");
    synchronized(this) {
       wait(60000);
    }
}

díky moc..vlákno se opravdu ukončí...

ale teď je problém ho znova nahodit...

když dám po ukončení znovu

if (vln.isAlive() == false) {
   vln.start();
}

tak to hodí chybu:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException
        at java.lang.Thread.start(Thread.java:638)
.....

Nevíte co s tím?díky moc

EDIT:

zatím jsem to vyřešil takto, ale nevím, zda je to dobré řešení:

Vlakno vln = new Vlakno();
if (vln.isAlive() == false) {
   vln.start();
}

Nastartovat thread sa da len raz, tu je javadoc ku start metode:

It is never legal to start a thread more than once.
In particular, a thread may not be restarted once it has completed
execution

Ak chces aby stale bezalo dookola, tak ho neukoncuj.

Inak potom samozrejme urobit novu instanciu, ako mas v poslednej ukazke...
..ale ten if je tam zbytocny, stale to bude false, kedze si nezavolal start()
na tom novom objekte....
cize staci:

Vlakno vln = new Vlakno();
vln.start();

Zpět do poradny Odpovědět na původní otázku Nahoru