使用 ThreadLocal 实现的计数器测试,threadlocal计数器,package tuni
分享于 点击 6016 次 点评:274
使用 ThreadLocal 实现的计数器测试,threadlocal计数器,package tuni
package tuning.threads;public class CounterTest extends Thread{ private static Object LOCK1 = new Object(); private static Object LOCK2 = new Object(); private static long startTime = -1; static int REPEAT; static int numThreads = 0; static boolean Go = false; private static int NUMBER_OF_THREADS = 4; //instance variable to specify which thread we are. int num; //Create a thread, assigning a unique value for the thread. //The value is used to index into the global array of counters //in Counter3 class. public CounterTest(int threadnum) { super(); num = threadnum; } synchronized static void incThreads() {numThreads++;} synchronized static void decThreads() {numThreads--;} static int getNumThreads() {return numThreads;} //And main which forks four threads, and run() which adds the value 1 to the Counter, //500,000 times consecutively, with timing code to determine how long from start of first //thread to termination of the last. public static void main(String[] args) { int tmpREPEAT = (args.length > 0) ? Integer.parseInt(args[0]) : 10000000; if (args.length < 2) { //don't use this if we have two or more args REPEAT = 10000; test(); } REPEAT = tmpREPEAT; test(); } public static void test() { for (int i = 0; i < NUMBER_OF_THREADS; i++) (new CounterTest(i)).start(); runOneTest(); runOneTest(); runOneTest(); } public static void runOneTest() { //wait until all threads are ready to run while(getNumThreads() < NUMBER_OF_THREADS) try{Thread.sleep(10);}catch(InterruptedException e){} //tell the threads to go synchronized (LOCK1) {LOCK1.notifyAll();} //wait for them all to stop while(getNumThreads() > 0) try{Thread.sleep(100);}catch(InterruptedException e){} //reset the start time startTime = -1; //All threads have stopped now, so we can release them synchronized (LOCK2) {LOCK2.notifyAll();} } public static void waitForGo(String mess) { //Register that we are ready to run incThreads(); //wait until told to start, so that we can start all //the threads at approximately the same time. synchronized(LOCK1) { try {LOCK1.wait();} catch (InterruptedException e) {} } System.out.println("Starting test for " + mess); //Set the start time only once at the beginning //of the first thread to start. setStartTime(); } public synchronized static void setStartTime() { //only sets the start time once if (startTime == -1) startTime = System.currentTimeMillis(); } public static void stop(String mess) { //print time and count for every thread. //Only the last thread to terminate gives full values. System.out.println(mess + " time: " + (System.currentTimeMillis()-startTime)); decThreads(); //Wait until the main threads knows that we've finished synchronized(LOCK2) { try {LOCK2.wait();} catch (InterruptedException e) {} } } public void run() { Counter1.initialize(0); waitForGo("Counter1"); for (int i = REPEAT; i > 0; i--) Counter1.addAmount(0, 1); stop("Counter1 count: " + Counter1.getAmount(0)); Counter2.initialize(0); waitForGo("Counter2"); for (int i = REPEAT; i > 0; i--) Counter2.addAmount(0, 1); stop("Counter2 count: " + Counter2.getAmount(0)); Counter3.initialize(this); waitForGo("Counter3"); for (int i = REPEAT; i > 0; i--) Counter3.addAmount(0, 1); stop("Counter3 count: " + Counter3.getAmount(0)); }}//该片段来自于http://byrx.net
用户点评