Avatar billede stephanryer Nybegynder
19. august 2008 - 10:56 Der er 8 kommentarer og
1 løsning

wait / notify virker ikke?

Jeg har forsøgt at benytted wait() og notify() i forbindelse med en gui, men uden held. Jeg har derefter forsøgt at lave et simpelt eksempel, men stadig uden held. Mine testklasser:

public class Thread1 extends Thread {
    @Override
    public void run()
    {
        while(true)
        {
            System.out.println("Thread1 before wait.");
            synchronized(this)
            {
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("Thread1 after wait.");
        }
    }
}


public class Thread2 extends Thread {
    @Override
    public void run()
    {
        while(true)
        {
            System.out.println("Thread2 before notify.");
            System.out.println("Tick tack...");
            synchronized(this)
            {
                notifyAll();
                notify();
            }
            System.out.println("Thread2 after notify.");
        }
    }
}



public class ThreadTest {
    public static void main(String[] args) {
        Thread1 t1 = new Thread1();
        Thread2 t2 = new Thread2();
        t1.start();
        t2.start();
    }
}


Hvad gør jeg galt?
Avatar billede stephanryer Nybegynder
19. august 2008 - 10:57 #1
Det skal lige siges, at thread2 kører i loop og udskriver fint, mens thread1 kun udskriver den øverste linie og stopper for evigt derefter.
Avatar billede arne_v Ekspert
19. august 2008 - 16:28 #2
t1 laver wait paa sig selv.

t2 laver notify paa sig selv.

t1 bliver aldrig notifyet da t2 og t1 er forskellige objekter
Avatar billede stephanryer Nybegynder
19. august 2008 - 16:49 #3
aha, dvs de skal have en reference til hinanden og så skal t2 kalde t1.notify() ?
Avatar billede arne_v Ekspert
19. august 2008 - 17:07 #4
Ja.
Avatar billede stephanryer Nybegynder
19. august 2008 - 17:10 #5
Tusind tak. Det forklarer jo en del. Men notifyAll() hvad gør den så helt præcist?
Avatar billede arne_v Ekspert
19. august 2008 - 17:12 #6
Ioevrigt, hvis det skal bruges til noget specifikt, saa er klasserne i java.util.concurrent
langt nemmere at bruge end synchronized/wait/notify !
Avatar billede arne_v Ekspert
19. august 2008 - 17:21 #7
Laes docs paa dem - hvis der er flere traade som venter paa samme objekt saa vil notify vaekke en af
dem mens notifyAll vil vaekke alle. Men "All" er altsaa mange traade et objekt ikke flere objekter.
Avatar billede stephanryer Nybegynder
19. august 2008 - 17:23 #8
Well jeg skal bruge det til at standse udførslen af noget kode indtil brugeren har klikket på en knap (I et vindue med forskellige knapper der kan vælges imellem). Men tak for tippet omkring concurrent. Det vil jeg lige se på.

Læg et svar :) Og mange tak for hjælpen.
Avatar billede arne_v Ekspert
19. august 2008 - 17:30 #9
check evt. den kode jg lavede her http://www.eksperten.dk/spm/840976 for nogle ideer

og svar
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