# Thread Pool Pattern



## bspainkf36 (21. Februar 2006)

Hey,
ich beschäftige mich momentan mit Threads bzw. mit ThreadPools. Ich habe mehrere Klassen, die miteinander kommunizieren. Es sollen requests ankommen, die einem Thread zugeteilt werden. Dieser soll die Aufgabe abarbeiten und anschließend weiterreichen. Von sun gibt es bereits ein Entwurf (java.util.concurrent.ThreadPoolExecutor) für dieses Muster. Ist es sinnvoll diese Vorlage zu nutzen oder sollte man möglichts etwas eigenes entwickeln. 

Gruß kon


----------



## Thomas Darimont (21. Februar 2006)

Hallo!

Ich wuerde empfehlen beim Standard zu bleiben und die von Sun (oder besser dem ehemaligen EDU.oswego.cs.dl.util.concurrent package von Doug Lea)angebotenen Executor Implementierungen zu verwenden.

Gruss Tom


----------



## bspainkf36 (21. Februar 2006)

Danke Thomas für die prompte Antwort 

Hast du vielleicht ein kleines Tutorial bzw. eine Übersicht für die Erzeugung von Pool mit dem ThreadPoolExecutor? Um beispielsweise einen Thread zu erzeugen, gibt es auch mehre Möglichkeiten.  Habe leider bei Mr. Allwissend (google) nichts schlüssiges Gefunden - das Thema ist relativ neu und irgendwie lässt sich nichts dazu finden 

Danke für die Hilfe.


----------



## Thomas Darimont (21. Februar 2006)

Hallo!

Schau mal hier:

```
/**
 * 
 */
package de.tutorials;

import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

/**
 * @author daritho
 * 
 */
public class ExecutorUsageExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.execute(new Runnable() {
            public void run() {
                info("started");
                for (int i = 0; i < 10; i++) {
                    try {
                        info("working");
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                info("finished");
            }
        });

        Future<String> future = executorService.submit(new Callable<String>() {
            public String call() throws Exception {
                info("started");
                try {
                    info("working");
                    TimeUnit.SECONDS.sleep(15);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                info("finished");
                return new Date().toString();
            }
        });

        executorService.execute(new Runnable() {
            public void run() {
                info("started");
                for (int i = 0; i < 10; i++) {
                    try {
                        info("working");
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                info("finished");
            }
        });

        System.out.println(future.get());
        
        executorService.shutdown();
    }

    static void info(String message) {
        System.out.println("[" + System.currentTimeMillis() + "]"
                + Thread.currentThread().getName() + " " + message);
    }
}
```

Gruss Tom


----------

