Avatar billede brianb Nybegynder
28. juli 2008 - 17:22 Der er 7 kommentarer og
1 løsning

Oprettelse af tråde som skal køre og notificere

Hejsa eksperter,

Jeg har lidt problemer med en en applikation jeg har lavet med et trådpar jeg har oprettet. Den består af 3 klasser hvor Kontroller sætter trådklasser (arbejder og oprydder) igang, arbejder skal bare tælle til 10 og når den er færdig skal den notificere oprydder som bare sender en system.out. Kan godt være der er en del fejl.

public class Kontroller {

   
    Arbejder arbejder;
    Oprydder oprydder;
   
    Kontroller(Arbejder arbejder, Oprydder oprydder) {
        this.arbejder = arbejder;
        this.oprydder = oprydder;
    }

    public static void main(String args[]) {
        Arbejder arbejder = new Arbejder();
        new Thread(arbejder).start();
        Oprydder oprydder = new Oprydder();
        new Thread(oprydder).start();
    }
}

public class Arbejder implements Runnable {

    Oprydder oprydder;
   
    public synchronized void run()
    {   
     
        try {
           
            for(int i=0; i<11; i++){
                System.out.println("Nu har jeg lavet "+i+" af 10");
            }
            notifyAll();
            wait();
           
        }
        catch (InterruptedException e) {}   
    }   
}

public class Oprydder implements Runnable{

    public synchronized void run()
    {   
       
        try {
            wait();
            System.out.println("Oprydning i gang");
            Thread.sleep(2000);
           
        }
        catch (InterruptedException e) {}   
    }   
   
}
Avatar billede arne_v Ekspert
28. juli 2008 - 17:28 #1
Naar du skal lave en multi threaded loesning, saa skal du kigge paa nemhed !

Nemheds faktoren er:

1)  simpel join
2)  brug af java.util.concurrent klasserne
3)  egen loesning med wait og notify

Du kan sagtens bruge #1 !

Lad Oprydder run lave en join paa Arbejder traaden.

Og lad main lave en join paa Oprydder traaden.

Simpelt at kode med stort set ingen fejl muligheder !
Avatar billede brianb Nybegynder
28. juli 2008 - 17:52 #2
Er mit eget kode helt håbløst? Eller hvorfor vil den ikke notificere oprydder tråden når Arbejder er kørt, kan du give et eksempel?
Avatar billede arne_v Ekspert
28. juli 2008 - 18:06 #3
Din kode vil ikke virke.

Du laver ikke wait og notify paa samme objekt.

Arbejder bliver ikke notified, saa den vil haenge.

Plus formentlig flere problemer.
Avatar billede arne_v Ekspert
28. juli 2008 - 18:14 #4
package july;

public class Kontroller {
    public static void main(String args[]) throws InterruptedException {
        Arbejder arbejder = new Arbejder();
        Thread t1 = new Thread(arbejder);
        t1.start();
        Oprydder oprydder = new Oprydder(t1);
        Thread t2 = new Thread(oprydder);
        t2.start();
        t2.join();
    }
}

class Arbejder implements Runnable {
    public void run() { 
        try {
            for(int i = 0; i < 11; i++){
                System.out.println("Nu har jeg lavet "+i+" af 10");
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            // ignore
        } 
    } 
}

class Oprydder implements Runnable {
    private Thread t;
    public Oprydder(Thread t) {
        this.t = t;
    }
    public synchronized void run()
    { 
        try {
            t.join();
            System.out.println("Oprydning i gang");
        } catch (InterruptedException e) {
            // ignore
        } 
    } 
}
Avatar billede brianb Nybegynder
28. juli 2008 - 19:25 #5
Når jeg fjerner join så er der ingen forskel?
Avatar billede arne_v Ekspert
28. juli 2008 - 19:37 #6
Hvis du fjerner join'en nede i Oprydder saa vil Oprydder koere foer Arbejde er
faerdig - ihvertfald hvis du som mig venter lidt i Arbejder - hvis man som i din
oprindelige kode bare udskriver 10 gange, saa kan Arbejder naa at vaere faerdig inden
Oprydder koerer.

Join'en i main er noedvendig hvis du foerst vil lave noget i main naar
Oprydder er faerdig eller hvis du aendrer traadenes type.
Avatar billede brianb Nybegynder
29. juli 2008 - 00:21 #7
Mange tak for de uddybende svar, smid et svar hvis du vil have point :)
Avatar billede arne_v Ekspert
29. juli 2008 - 04:00 #8
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

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