Avatar billede roo104 Nybegynder
27. juni 2004 - 14:37 Der er 14 kommentarer og
1 løsning

Thread Pool

Jeg har leget lidt med denne Thread Pool http://www.samspublishing.com/articles/article.asp?p=30483&seqNum=6 og det virker sådan set også, men mit program stopper bare aldrig, det er som om de sidste tråde i poolen aldrig bliver fjernet/slået ihjel. Alle tråde bliver udført, men programmet kommer bare til at "hænge", så jeg må slå det ihjem manuelt, nogen der har et bud på hvad der kan være galt ?
Avatar billede arne_v Ekspert
27. juni 2004 - 15:28 #1
Jeg får samme problem med den kode.

Jeg tror ikke at den er for god den kode.

Den bruger bl.a. finalizer til at interrupte trådene med.

Jeg lavede en ny metode udfra finalizeren:

public void stopAll() 
{
  done.reset();
  for (int i=0;i<threads.length;i++) {
  threads[i].interrupt();
  done.workerBegin();
  }
  done.waitDone();
}
}

og når jeg kalder den så afsluttes programmet.

Men jeg tror at den thread pool kan laves bedre.
Avatar billede roo104 Nybegynder
27. juni 2004 - 17:13 #2
Ja det virker med din stopAll. Det er altså threads[i].destroy(); det får den til at hænge?
Har du et eksempel på en bedre pool ?
Avatar billede arne_v Ekspert
27. juni 2004 - 17:18 #3
Nej - den hænger fordi finalizeren aldrig bliver kaldt.

Jeg har fjernet threads destroy fordi det giver en exception.
Avatar billede arne_v Ekspert
27. juni 2004 - 17:23 #4
Avatar billede arne_v Ekspert
27. juni 2004 - 17:25 #5
Der er en anden implementation her:
  http://www-106.ibm.com/developerworks/library/j-jtp0730.html
men den terminerer heller ikke (dette er dog per design).
Avatar billede arne_v Ekspert
27. juni 2004 - 17:28 #6
Men jeg tror da hurtigt at jeg kunne lave en simpel thread pool som er nem
at få til at terminere.

Skal jeg ?
Avatar billede roo104 Nybegynder
27. juni 2004 - 17:28 #7
Kunne man bygge et flag ind i den og så hejse det når alle tråde var færdige ?
Avatar billede roo104 Nybegynder
27. juni 2004 - 17:30 #8
Meget gerne, ellers leger jeg lidt med den du postede, tror også godt jeg kan få den til at terminere, hvis ikke du gider. Den virker meget simplere
Avatar billede arne_v Ekspert
27. juni 2004 - 18:35 #9
import java.util.LinkedList;

public class ThreadPool {
    private LinkedList queue;
    private ThreadWorker[] t;
    public ThreadPool(int nthreads) {
        queue = new LinkedList();
        t = new ThreadWorker[nthreads];
        for (int i = 0; i < t.length; i++) {
            t[i] = new ThreadWorker(queue);
            t[i].start();
        }
    }
    public void addTask(Runnable r) {
        synchronized (queue) {
            queue.add(r);
            queue.notify();
        }
    }
    public void stop() {
        for (int i = 0; i < t.length; i++) {
            t[i].finish();
        }
        for (int i = 0; i < t.length; i++) {
            try {
                t[i].join();
            } catch (InterruptedException e) {
                // should never happend
            }
        }
    }
    public int queueSize() {
        int n;
        synchronized(queue) {
            n = queue.size();
        }
        return n;
    }
}

class ThreadWorker extends Thread {
    private LinkedList queue;
    private boolean done;
    public ThreadWorker(LinkedList queue) {
        this.queue = queue;
        done = false;
    }
    public void run() {
        while (!done) {
            Runnable r = null;
            synchronized (queue) {
                if (queue.size() == 0) {
                    try {
                        queue.wait(10000);
                    } catch (InterruptedException e) {
                        // should never happend
                    }
                }
                if(queue.size() > 0) {
                    r = (Runnable) queue.removeFirst();
                }
            }
            if (r != null) {
                try {
                    r.run();
                } catch (RuntimeException e) {
                    // do not stop
                }
            }
        }
    }
    public void finish() {
        done = true;
    }
}
Avatar billede arne_v Ekspert
27. juni 2004 - 18:35 #10
public class TestThreadPool {
    public static void main(String[] args) throws Exception {
        ThreadPool tp = new ThreadPool(1000);
        int[] a = new int[100000];
        for(int i = 0; i < a.length; i++) {
            tp.addTask(new Test(a, i));
        }
        while(tp.queueSize() > 0) {
            System.out.println(tp.queueSize());
            Thread.sleep(5000);
        }
        tp.stop();
        for(int i = 0; i < a.length; i++) {
            if(a[i] != i) {
                System.out.println("Error in task " + i);
            }
        }
       
    }
}

class Test implements Runnable {
    private int[] a;
    private int ix;
    public Test(int[] a, int ix) {
        this.a = a;
        this.ix = ix;
    }
    public void run() {
        try {
            Thread.sleep((int)(1000*Math.random()));
        } catch (InterruptedException e) {
        }
        a[ix] = ix;
    }
}
Avatar billede arne_v Ekspert
27. juni 2004 - 18:36 #11
Det var det bedste jeg lige kunne finde på en søndag eftermiddag.
Avatar billede arne_v Ekspert
27. juni 2004 - 18:36 #12
og et svar
Avatar billede roo104 Nybegynder
27. juni 2004 - 18:43 #13
Smukt .. hvordan er LinkedList i forhold til et HashMap, har det nogen performance forskel ?
Avatar billede arne_v Ekspert
27. juni 2004 - 18:47 #14
Umiddelbart synes jeg ikke at HashMap egner sig til at lave en kø i.
Avatar billede roo104 Nybegynder
27. juni 2004 - 18:48 #15
Ok, mange 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