Det afhænger jo lidt af hvordan man har kodet det.
For simple tilfælde finder jeg følgende approach nemt at bruge:
- lav en klasse som extends Threads - lav en constructor med en relevant klasse objekt som argument der gemmer en reference til argumentet - laver run metoden som kan bruge metoder i det gemte klasss objekt - i klassen der skal started tråden kalder man så constructoren med this og kalder start metoden på argumentet
public class Xxxx { public final static int N = 10; ... public void startThreads() { XxxxThread[] xt = new XxxxThread[N]; for(int j = 0; j < N; j++) { xt[j] = new XxxxThread(this); xt[j].start(); } for(int j = 0; j < N; j++) { try { xt[j].join(); } catch (InterruptedException ex) { fail("thread error"); } } } ...
class XxxxThread extends Thread { Xxxx xxxx; public XxxxThread(Xxxx xxxx) { this.xxxx = xxxx; } public void run() { // brug public metoder i xxxx } } }
Du kan sige at jeg laver det lidt omvendt end det du spørger om.
Jeg lader tråden get/set data i den klasse objekt der har startet tråden i.s.f. at lade den get/set data i tråd objektet.
Det kan du også. Du kan godt lave public metoder i dit tråd objekt og kalde dem. Problemet er at du ikke har meget kontrol over i hvilken state tråden er når du kalder. Hvis du lader tråden opdatere den anden vej, så kan det ske på de rigtige tidspunkter.
Her er vores kode, og vi kan ikke hive variablen filosofnr ud af objektet Filosof, der ligger i tråden temp. Temp modtages i metoden Spis. Vi vil altså gerne have adgang til temp.Filosof.filosofnr
public class Filosof extends Thread { public int filosofnr;
public Filosof(int filosofnr) { this.filosofnr=filosofnr; System.out.println(filosofnr); }
public static void main(String[] arguments) { Start start = new Start();
for (int n = 0; n < 5; n++) { Filosof f = new Filosof(n); filosof.add(f); ((Filosof) filosof.get(n)).start(); } int counter = 20; while (counter >= 0) { start.spis((Filosof) filosof.get(0)); counter--; } } }
Nej vi er ikke helt færdige endnu med main... Men det vil altså sige at Filosof f = new Filosof(n); opretter en ny tråd fordi klassen Filosof extends tråde.? Hvis det er sandt, vil det så ikke sige at det vi prøvede på først var at oprette en tråd i eb tråd?
opretter et objekt som er klar til at starte en tråd. Det er først .start() som faktisk starter tråden.
Jeg kan faktisk ikke helt gennemskue jeres oprindelige kode.
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.