Avatar billede mortennobel Nybegynder
17. maj 2005 - 22:00 Der er 10 kommentarer og
1 løsning

Threads, wait og notify

Er der ikke lige nogen som kort kan forklare mig hvordan wait og notify virker.

For at kunne kalde wait, skal man sætte en lås på objektet vha. en synchronized blok. Men for at en anden tråd kan 'vække' tråden igen, skal man kalde notify på objektet, men også ved notify skal man sætte en lås på objektet. Jeg kan så ikke helt forstå hvordan dette nogensinde vil kunne ske, da objektet jo allerede er låst.

Please udfyld dette hul i min java-opdragelse ;-)

- Morten

Ps. Jeg kan godt se at det kan lade sig gøre vha. notifyAll, men mit spørgsmål vedr. kun metoden notify
Avatar billede arne_v Ekspert
17. maj 2005 - 22:04 #1
når du går i wait får andre lov at låse og du kører først videre efter wait
når du har låst igen
Avatar billede mortennobel Nybegynder
17. maj 2005 - 22:08 #2
Aha .... et relateret problem jeg har, er, hvilke objekter kan en tråd få lov til at låse? Jeg syntes tit at jeg løber ind i at en tråd ikke kan få lov til at låse et objekt.
Avatar billede arne_v Ekspert
17. maj 2005 - 22:16 #3
kan du komme med et eksempel ?
Avatar billede mortennobel Nybegynder
17. maj 2005 - 22:31 #4
Følgende kaster en IllegalMonitorStateException. Er det fordi det er under J2ME?

-----

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class MIDlet1 extends MIDlet implements Runnable {

    Object lock = new Object();
   
    public MIDlet1() {
        Thread t = new Thread(this);
        t.start();
    }

    public void startApp() {}

    public void pauseApp() {}

    public void destroyApp(boolean unconditional) {
    }

    public static void quitApp() {
    }

    public void run() {
        synchronized(lock){
            System.out.println("Test1");
            try {
                wait(10000);
            } catch (InterruptedException ex) {
            }
            System.out.println("Test2");
        }
    }

}
Avatar billede arne_v Ekspert
17. maj 2005 - 22:33 #5
prøv og ret

wait(10000);

til

lock.wait(10000);
Avatar billede mortennobel Nybegynder
17. maj 2005 - 22:37 #6
Hmmm ... det hjalp :-D

Tak for hjælpen!
Avatar billede arne_v Ekspert
17. maj 2005 - 22:39 #7
svar
Avatar billede arne_v Ekspert
17. maj 2005 - 22:40 #8
forklaringen er at

wait(10000);

betyder

this.wait(10000);

og at du ikke har lås på this
Avatar billede mortennobel Nybegynder
17. maj 2005 - 22:45 #9
Ja det er jeg med på.
Avatar billede mortennobel Nybegynder
17. maj 2005 - 22:46 #10
For nu også lige at snakke lidt om notifyAll, hvorfor lykkes det så ikke nedenstående tråd at vågne igen?
_________________________________


import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class MIDlet1 extends MIDlet implements Runnable {

    Object lock = new Object();
   
    public MIDlet1() {
        Thread t = new Thread(this);
        t.start();
        try {
            Thread.sleep(1000);
        } catch (Exception ex) {           
        }
        synchronized(lock){
            try {
                notifyAll();
            } catch (Exception ex) {
               
            }
        }
    }

    public void startApp() {}

    public void pauseApp() {}

    public void destroyApp(boolean unconditional) {
    }

    public static void quitApp() {
    }

    public void run() {
        synchronized(lock){
            System.out.println("Test1");
            try {
                lock.wait(1000000);
            } catch (InterruptedException ex) {
            }
            System.out.println("Test2");
        }
    }
}
Avatar billede arne_v Ekspert
17. maj 2005 - 23:04 #11
samme problem !

brug:

lock.notifyAll();
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester