Mega Code Archive

 
Categories / Java / Threads
 

Thread pool

/* Java Threads, 3rd Edition By Scott Oaks, Henry Wong 3rd Edition September 2004  ISBN: 0-596-00782-5 */ import java.util.concurrent.*; import java.util.concurrent.atomic.*; public class CreateTest extends Thread {   static AtomicInteger nCalls;   static int target = 0;   static boolean done = false;   static Object lock = new Object();   public static void main(String[] args) {     target = 10000;     doTestCreate();     doTestPool(8);     doTestLoop();     target = Integer.parseInt(args[0]);     cleanGC();     Timestamp createTS = new Timestamp(TimeUnit.MICROSECONDS);     doTestCreate();     createTS.stop();     System.out.println("Create thread test took " + createTS);     cleanGC();     Timestamp pool8TS = new Timestamp(TimeUnit.MICROSECONDS);     doTestPool(8);     pool8TS.stop();     System.out.println("Pool test (8 threads) took " + pool8TS);     cleanGC();     Timestamp poolTS = new Timestamp(TimeUnit.MICROSECONDS);     doTestPool(1);     poolTS.stop();     System.out.println("Pool test (1 thread) took " + poolTS);     cleanGC();     Timestamp loopTS = new Timestamp(TimeUnit.MICROSECONDS);     doTestLoop();     loopTS.stop();     System.out.println("Loop test took " + loopTS);     double d = ((double) (createTS.elapsedTime() - loopTS.elapsedTime()))         / target;     System.out.println("Creating a thread took " + d + " " + loopTS.units()         + " per thread");     d = ((double) (createTS.elapsedTime() - poolTS.elapsedTime())) / target;     System.out.println("Using a thread pool (1 thread) saved  " + d + " "         + loopTS.units() + " per task");     d = ((double) (createTS.elapsedTime() - pool8TS.elapsedTime()))         / target;     System.out.println("Using a thread pool (8 threads) saved  " + d + " "         + loopTS.units() + " per task");     d = ((double) (poolTS.elapsedTime() - loopTS.elapsedTime())) / target;     System.out.println("Thread pool overhead (1 thread) is " + d + " "         + loopTS.units() + " per task");     d = ((double) (pool8TS.elapsedTime() - loopTS.elapsedTime())) / target;     System.out.println("Thread pool overhead (8 threads) is " + d + " "         + loopTS.units() + " per task");   }   static void doTestLoop() {     nCalls = new AtomicInteger(0);     done = false;     for (int i = 0; i < target; i++)       work();     synchronized (lock) {       while (!done)         try {           lock.wait();         } catch (Exception e) {         }     }   }   static void doTestCreate() {     done = false;     nCalls = new AtomicInteger(0);     for (int i = 0; i < target; i++) {       Thread t = new CreateTest();       t.start();     }     synchronized (lock) {       while (!done)         try {           lock.wait();         } catch (Exception e) {         }     }   } static void doTestPool(int nThreads) {   done = false;   nCalls = new AtomicInteger(0);         ThreadPoolExecutor tpe = new ThreadPoolExecutor(nThreads, nThreads,           50000L, TimeUnit.MILLISECONDS,           new LinkedBlockingQueue<Runnable>());         Runnable r = new CreateTest();         for (int i = 0; i < target; i++) {             tpe.execute(r);         }         tpe.shutdown();         try {             tpe.awaitTermination(10000000L, TimeUnit.SECONDS);         } catch (Exception e) {}     }  public void run() {     work();   }   public static void work() {     int n = nCalls.incrementAndGet();     if (n == target) {       synchronized (lock) {         done = true;         lock.notify();       }     }   }   public static void cleanGC() {     System.gc();     System.runFinalization();     System.gc();   } }