Avatar billede BlueDolfin Nybegynder
16. januar 2011 - 16:01 Der er 7 kommentarer og
1 løsning

thread pool

Jeg sidder og laver en opgave hvor jeg skal bruge flere tråde. Jeg skal bruge thread pool, men kan ikke rigtig finde ud af helt præcis hvad det er og hvordan jeg bruger/laver det.
Opgaven lyder "run the threads using a thread pool"

indtil videre ser min kode således ud (2 klasser):

public class Printer implements Runnable {
    private final String message;
    private int howManyTimes;

    public Printer(final String message, int howManyTimes) {
        this.message = message;
        this.howManyTimes = howManyTimes;
    }

    public void run() {
        for (int i = 0; i < howManyTimes; i++){
                System.out.println(i + ":" + message);
        }
    }
}

public static void main(final String[] args) {

        final Runnable printer1 = new Printer("Hi there from number 1", 20);
        final Thread thread = new Thread(printer1);


        final Runnable printer2 = new Printer("number 2", 15);
        final Thread thread2 = new Thread(printer2);
        thread.start();
        thread2.start();
}

Sidste spørgsmål er hvad er forskellen mellem  "cached thread pool" og "fixed thread pool"?
På forhånd mange tak
Avatar billede arne_v Ekspert
16. januar 2011 - 16:12 #1
Koden bruger jo ikke thread pool.

http://www.eksperten.dk/guide/27 har et eksempel på brug af thread pool nederst.
Avatar billede BlueDolfin Nybegynder
16. januar 2011 - 16:48 #2
Jeg har læst din guide, men er ikke sikker på at det er det der menes med den opgave jeg har fået.

Jeg er godt klar over at jeg ikke bruger det. Det er hele pointen hvordan?

Mit problem er jeg jeg har ikke fattet en bjælde...

jeg har løsningen på opgaven og den ser således ud:

public class MainPool {

    public static void main(final String[] args) {
        final Printer printer1 = new Printer(10, "Hi there from number 1", 100);
        final Thread thread = new Thread(printer1);
        thread.setPriority(Thread.MIN_PRIORITY);

        final Printer printer2 = new Printer(10, "number 2", 100);
        final Thread thread2 = new Thread(printer2);
        thread2.setPriority(Thread.MAX_PRIORITY);

        thread.start();
        thread2.start();
    }
}

public class Printer implements Runnable {

    private final int howMany;
    private final String message;
    private final int sleepTime;

    public Printer(final int howMany, final String message, final int sleepTime) {
        this.howMany = howMany;
        this.message = message;
        this.sleepTime = sleepTime;
    }

    public void run() {
        for (int i = 0; i < howMany; i++) {
            System.out.println(i + ":" + message);
        }
    }
}

men forstår stadigvæk ikke...
Avatar billede arne_v Ekspert
16. januar 2011 - 18:00 #3
Hvis opgaven siger at du skal bruge en thread pool så skal du sikkert bruge en thread pool.

Så du skal veligang med at konvertere fra standalone threads til thread pool.
Avatar billede BlueDolfin Nybegynder
17. januar 2011 - 15:02 #4
Nu er jeg kommet så langt men er ikke helt med på om jeg bevæger mig i den rigtige retning...

public class NewMain{

    public static void main(String[] args) throws InterruptedException, ExecutionException{
    ExecutorService es = Executors.newFixedThreadPool(15);
        Future<Printer> future = es.submit(new Printer(message,howManyTimes));    Fejl i denne linie!!*
        es.shutdown();
    }
}

*incompatible types
  required: java.util.concurrent.Future<firstthread.Printer>
  found:    java.util.concurrent.Future<capture#1 of ?>

internal error; cannot instantiate Printer(java.lang.String,int) at firstthread.Printer to ()

cannot find symbol
  symbol:  variable message
  location: class NewMain

cannot find symbol
  symbol:  variable howManyTimes
  location: class NewMain
Avatar billede arne_v Ekspert
17. januar 2011 - 15:47 #5
Start med og giv message og howManyTimes nogle værdier.
Avatar billede BlueDolfin Nybegynder
18. januar 2011 - 09:57 #6
Det er det endelig resultat. Mange tak for hjælpen.

public class NewMain{

    public static void main(String[] args) throws InterruptedException, ExecutionException{
    ExecutorService es = Executors.newFixedThreadPool(5);
        Future<Printer> future = (Future<Printer>)es.submit(new Printer("printer1 udskrivning",15));
        es.shutdown();
    }
}
Avatar billede arne_v Ekspert
18. januar 2011 - 23:42 #7
all set?
Avatar billede BlueDolfin Nybegynder
14. februar 2011 - 12:48 #8
Ja jeg fandt en meget simpel løsning og det virker.
Tak for hjælpen.

Sådan ser det så ud.

private static int poolSize = 2;
    private static final ExecutorService pool = Executors.newFixedThreadPool(poolSize);

    public static void main(String[] args) throws InterruptedException, ExecutionException{
      pool.execute(new Printer("printer skriver", 20));
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