Avatar billede javanic Nybegynder
29. februar 2004 - 12:03 Der er 14 kommentarer og
1 løsning

Udfør hver metode i seperat tråd

Jeg har klasserne Person, Queue. Person består som i nok kan regne ud af nogle person-objekter. I Queue-klassen er der kun oprettet et enkelt objekt (en kø), som jeg så smækker de pågældende Person-objekter ind i... (done)

Mit problem består nu i at jeg vil have oprettet seperate tråde for hvert hvert enkelt metode-kald.

F.eks.
Ønsker jeg at udskrive samtlige personer i køen -> opret seperat tråd !!!
Ønsker jeg at indsætte en ny person i køen -> opret seperat tråd !!!
etc...

Hvis vi siger at jeg har en main-klasse til at teste skidtet i. Er det så i selve min Main som jeg skal lave tråde af, eller er det Queue/Person.
Avatar billede jakoba Nybegynder
29. februar 2004 - 13:25 #1
Det er en lidt underlig måde at bruge tråde på. Kanf du forklare hvorfor insert skal køre i sin egen tråd ?

Men det kan sagtens gøres. Grundridset er

class ActionInsert extends thread {
    Person p;
    Queue  q;
    public ActionInsert( Person p, Queue q ) {
        this.p = p;
        this.q = q;
    } //endconstructior

    public void run() {
        // kode der indsætter personen p i køen q
        // NB: koden skal kunne køre samtidig med andre inserts, og samtidig med at
        //  køen udskrives. du bliver nødt til at minimere og synkronisere de
        //  perioder hvor køens invarianter ikke er overholdt
    }
} //endclass ActionInsert

mvh JakobA
Avatar billede arne_v Ekspert
29. februar 2004 - 13:25 #2
Normalt vil man lave en separat lille klasse med sin egen run metode til
at køre noget i en tråd (evt. i en ikke public klasse i samme fil som din main).

Men man kan også lave en anonym klasse til det. Det synes jeg dog ikke er
specielt kønt.

Hvis du vil have eksemple på hvordan man starter tråde i Java, så kan evt.
kigge på min artikel om emnet.
Avatar billede arne_v Ekspert
29. februar 2004 - 13:27 #3
Avatar billede jakoba Nybegynder
29. februar 2004 - 13:33 #4
Altså en klasse der extender thread for hver hver handling
Giv parametre til handlingen med i constructoren.
udfør selve handlingen i en void metode der hedder run

I din hovedklasse (main metode) kan du sa oprette en handling of sætte den igang med:
            a = new ActionInsert( new Person("javanic"), dinKq );
            a.start();        // 'start' metoden arvede vi fra thread og den
                              // finder din 'run' metode og sætter den igang
Avatar billede javanic Nybegynder
29. februar 2004 - 13:59 #5
jakoba -> Mht. hvorfor at metoderne skal oprettes som seperater tråde, så er det ganske enkelt et krav.

Er det virkeligt nødvendigt at lave en klasse for hver handling (metode) som jeg vil køre i en tråd for sig...?
Kan man ikke bare "modificere" sin run() til at teste for handlingen, eller er det helt umuligt?

Arne_v -> Den seperate klasse du snakke om,...er det ikke bare min Main ?
Avatar billede jakoba Nybegynder
29. februar 2004 - 14:24 #6
Jo du kan godt lave en tråd der får handlingen med som parameter, men det er mere komplexificering end egentlig nyttigt.

class Action extends thread {
    static final int INSERT = 0;
    static final int UDSKRUV = 1;
    //... osv hvad handlinger du vil have
    Person p;
    Queue  q;
    int handling;
    public Action( Queue q ) {  // bemærk at parametrene til udskriv er forskellige fra dem til insert
        this.p = null;
        this.q = q;
        this.handling = UDSKRIV;  // for du gav ikke en person med
    } //endconstructior
    public Action( Person p, Queue q ) {
        this.p = p;
        this.q = q;
        this.handling = INSERT;  // for du gav en person med
    } //endconstructior

    public void Insert() {
        // kode der indsætter personen p i køen q
        // NB: koden skal kunne køre samtidig med andre inserts, og samtidig med at
        //  køen udskrives. du bliver nødt til at minimere og synkronisere de
        //  perioder hvor køens invarianter ikke er overholdt
    }
    public void Udskriv() {
        // kode der udskriver køen q
        // NB: koden skal kunne køre samtidig med andre inserts, og samtidig med at
        //  køen udskrives. du bliver nødt til at minimere og synkronisere de
        //  perioder hvor køens invarianter ikke er overholdt
    }
    public void run() {
        switch ( handling ) {
            case INSERT:  Insert();
                          break;
            case UDSKRIV: Udskriv();
                          break;
            //... evt flere handlinger
            default      System.out.println( "FEJL. der er noget rivendes galt her." );           
        }
    }
} //endclass Action

mvh JakobA
Avatar billede javanic Nybegynder
29. februar 2004 - 14:40 #7
Aaahhh, tak jakob !

- prøver lige at arbejde lidt med det. Tror sgu at du har givet mig en åbenbaring ;o) Har siddet et rigtig godt styke tid og funderet over hvordan fanden jeg kunne teste for handlingen, efter som et jeg ikke kunne parameter-pverføre min handling til run()... men det bliver selvfølgelig løst ved at oprette et objekt for hver handling.

Men jeg kan forstå på dig, at det ikke ligefrem er den løsning du selv ville vælge..?
Avatar billede jakoba Nybegynder
29. februar 2004 - 15:03 #8
Næe det er det godtnok ikke.  Især insert  handlingen er jeg lidt ked af at udføre i en tråd. for iløbet af din insert operation vil der være tidspunkter hvor køen ikke 'hænger sammen' ig hvis en anden tråde så får lov at bryde ind og prøver at fx udskrive køen eller indsætte noget andet så kan det gå grueligt galt.

Så jeg ville prøve at undgå behovet for de der tråde. men hvis du sørger for at synkronisere på de korrekte steder kan det da godt lade sig gøre. Måske det endda er det problem opgaven går ud på at i skal lære at forstå. :)

mvh JakobA
Avatar billede javanic Nybegynder
29. februar 2004 - 16:15 #9
jakob -> for at komme uden om "problemet" - kunne man så ikke lave programmet sådan, at at der bare oprettes én tråd til indsættelse og én til udskrivelse - ville jeg så ik kunne slippe for den ekstra handling-klasse...???
Avatar billede jakoba Nybegynder
29. februar 2004 - 17:17 #10
Udskrivning kan også gå galt hvis din kø ikke hænger sammen på det tidspunkt du prøver at udskrive. (du kan nok programmere den så den gør, men du skal være opmærksom på det som en faldgrube)

Anyways, lav noget kode og se hvad der sker :-))
Avatar billede javanic Nybegynder
29. februar 2004 - 17:31 #11
ok,...du skal i hvert fald have 1000 tak for hjælpen ;o)
Avatar billede arne_v Ekspert
29. februar 2004 - 21:29 #12
Som jeg skrev kan man jo lave små ikke public klasser i samme .java fil som
den egentlige klasse.

Hvis man skal have en enkelte klasse til at udføre flere forskellige ting,
så vil jeg foreslå brug af GoF Command Pattern fremfor en konstant og
en switch statement.

Men det lyder som om du er all set. Skriv hvis du gerne vil have det command
pattern uddybet.
Avatar billede javanic Nybegynder
29. februar 2004 - 23:13 #13
Hej Arne (og tak for hjælpen)!

...ville du så lave de 2 metoder/handlinger om til indre klasser, eller...?

Hvis du har tid og løst, vil jeg meget gerne høre lidt nærmere om dit patern.
skal jeg oprette et spørgsmål, eller har du lavet en artikel om det, som det er
god ide at jeg først lige tager en kigger på...??? :o)
Avatar billede arne_v Ekspert
01. marts 2004 - 09:27 #14
Jeg har overvejet at skrive en artikel om command pattern. Men den er ikke lavet.

Command patter går kort fortalt ud på at du laver en abstrakt basis klasse
med en execute metode. Så laver du konkrete sub klasser af denne basis klasse
med konkrete execute metoder.

Din tråd klasses konstruktor tager så et argument af den abstrakte basis
klasse som argument til constructor og gemmer en referance, så run kan
kalde execute metoden.
Avatar billede javanic Nybegynder
01. marts 2004 - 19:41 #15
thanks, Arne !

Er så godt som færdigt med programmet, men har været på nettet og hente en hel del om "Gang of Four", som jeg nu vil gå i krig med... :o)

sidst men ikke mindst,...endnu engang tak !!
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