1 8 9 package test; 10 11 import java.io.PrintStream ; 12 import java.io.PrintWriter ; 13 import java.util.ArrayList ; 14 import java.util.List ; 15 16 19 public class MultiThreadTestRunner 20 { 21 public abstract static class Test 22 { 23 private List throwables = new ArrayList (); 24 25 public abstract void test() throws Exception ; 26 27 private synchronized void addThrowable(Throwable x) 28 { 29 throwables.add(x); 30 } 31 32 private synchronized Throwable [] getThrowables() 33 { 34 return (Throwable [])throwables.toArray(new Throwable [throwables.size()]); 35 } 36 } 37 38 private class MultiThrowable extends Exception 39 { 40 private final Throwable [] throwables; 41 42 public MultiThrowable(Throwable [] throwables) 43 { 44 this.throwables = throwables; 45 } 46 47 public void printStackTrace(PrintStream stream) 48 { 49 synchronized (stream) 50 { 51 stream.println(this); 52 for (int i = 0; i < throwables.length; ++i) throwables[i].printStackTrace(stream); 53 } 54 } 55 56 public void printStackTrace(PrintWriter writer) 57 { 58 synchronized (writer) 59 { 60 writer.println(this); 61 for (int i = 0; i < throwables.length; ++i) throwables[i].printStackTrace(writer); 62 } 63 } 64 } 65 66 private final int threads; 67 private final int iterations; 68 69 public MultiThreadTestRunner(int threads, int iterations) 70 { 71 this.threads = threads; 72 this.iterations = iterations; 73 } 74 75 public void run(final Test test) throws Exception 76 { 77 Thread [] runners = new Thread [threads]; 78 for (int i = 0; i < threads; ++i) 79 { 80 runners[i] = new Thread (new Runnable () 81 { 82 public void run() 83 { 84 for (int i = 0; i < iterations; ++i) 85 { 86 try 87 { 88 test.test(); 89 } 90 catch (Throwable x) 91 { 92 test.addThrowable(x); 93 } 94 } 95 } 96 }); 97 } 98 99 for (int i = 0; i < threads; ++i) runners[i].start(); 100 101 for (int i = 0; i < threads; ++i) runners[i].join(); 102 103 Throwable [] failures = test.getThrowables(); 104 if (failures != null && failures.length > 0) throw new MultiThrowable(failures); 105 } 106 } 107 | Popular Tags |