/*
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();
}
}
|