Avatar billede lasse_hyldal Nybegynder
20. februar 2003 - 12:23 Der er 7 kommentarer og
1 løsning

Objekter i threads

Hvordan hiver man et objekt o ud af en tråd t?
Hvordan tilgår man o's variabler i tråd t?
Avatar billede arne_v Ekspert
20. februar 2003 - 12:36 #1
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
Avatar billede arne_v Ekspert
20. februar 2003 - 12:41 #2
Eksempel:

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
        }
    }
}
Avatar billede arne_v Ekspert
20. februar 2003 - 12:44 #3
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.
Avatar billede lasse_hyldal Nybegynder
20. februar 2003 - 13:00 #4
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 class Start

{
    static List filosof= new ArrayList();


    public void spis(Thread temp)
    {
        Filosof current= (Filosof)temp;   
            System.out.println("Nu venter: "+current.filosofnr);
        synchronized(this)
        {
            System.out.println("Nu spiser filosof: ");
        }
    }

    public static void main(String[] arguments)
    {
        Start start= new Start();

        for(int n=0;n<5;n++)
        {
        filosof.add(new Thread(new Filosof(n))) ;
        Thread current =  (Thread)filosof.get(n);
        current.start();
        }

        int counter=20;
        while(counter>=0)
        {
            start.spis((Thread)filosof.get(0));
            counter--;
        }
    }
}

Vi har prøvet foregæves med try catch :o(
What to do?
Avatar billede arne_v Ekspert
20. februar 2003 - 13:15 #5
Følgende compiler og kører:

public class Filosof extends Thread {
    public int filosofnr;

    public Filosof(int filosofnr) {
        this.filosofnr = filosofnr;
        System.out.println(filosofnr);
    }
    public void run() {
    }

}

import java.util.*;

public class Start {
    static List filosof = new ArrayList();

    public void spis(Filosof temp) {
        System.out.println("Nu venter: " + temp.filosofnr);
        synchronized (this) {
            System.out.println("Nu spiser filosof: ");
        }
    }

    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--;
        }
    }
}
Avatar billede arne_v Ekspert
20. februar 2003 - 13:16 #6
Men jeg tror at der er et eller andet med logikken i den sidste
del af main som enten ikke er færdig eller som jeg har totalt
misforstået.
Avatar billede lasse_hyldal Nybegynder
20. februar 2003 - 13:24 #7
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?
Avatar billede arne_v Ekspert
20. februar 2003 - 13:33 #8
Filosof f = new Filosof(n);

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.
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