29. februar 2004 - 12:03Der 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.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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
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.
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
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 ?
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
- 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..?
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å. :)
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...???
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)
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.
...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)
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.
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 !!
Synes godt om
Ny brugerNybegynder
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.