1
2 package uk.co.badgersinfoil.cvprof.example;
3
|
4 public class Multithreaded implements Runnable {
|
5
6 private static final int THREAD_COUNT = 10;
7
8 public static void test() {
|
9 Multithreaded test = new Multithreaded();
10 synchronized (test) {
11 for (int i=0 ; i<THREAD_COUNT ; i++) {
12 Thread t = new Thread(test);
13 t.start();
|
14 }
|
15 test.untilAllStart();
16 test.notifyAll();
17 }
18 }
|
19
20 private int startCount;
21
22 public void run() {
23 // With all these method calls we hope to catch evidence of
24 // 'lost updates' to the profiling data.
25 //
26 // They will allways be executed one-after-the-other, so any
27 // 'gaps' are evidence of something wrong.
|
28 startIt();
29 thing();
30 thing();
31 thing();
32 thing();
33 thing();
34 thing();
35 thing();
36 thing();
37 thing();
38 thing();
39 thing();
40 thing();
41 thing();
42 thing();
43 thing();
44 thing();
45 thing();
46 thing();
47 thing();
48 thing();
49 thing();
50 thing();
51 thing();
52 thing();
53 thing();
54 thing();
55 thing();
56 thing();
57 thing();
58 thing();
59 thing();
60 thing();
61 thing();
62 thing();
63 thing();
64 thing();
65 thing();
66 thing();
67 thing();
68 thing();
69 thing();
70 thing();
71 thing();
72 thing();
73 thing();
74 thing();
75 thing();
76 thing();
77 thing();
78 thing();
79 thing();
80 thing();
81 thing();
82 thing();
83 thing();
84 thing();
85 thing();
86 thing();
87 thing();
88 thing();
89 thing();
90 thing();
91 thing();
92 thing();
93 thing();
94 thing();
95 thing();
96 thing();
97 thing();
98 thing();
99 thing();
100 thing();
101 thing();
102 thing();
103 thing();
104 thing();
105 thing();
106 thing();
107 thing();
108 thing();
109 }
|
110
111 private synchronized void startIt() {
|
112 startCount++;
113 untilAllStart();
114 }
|
115
116 private synchronized void untilAllStart() {
117 try {
|
118 notifyAll();
119 while (startCount < THREAD_COUNT) {
120 wait();
|
121 }
|
122 } catch (InterruptedException e) {
|
123 > throw new Error("Unexpected inturruption");
|
124 }
|
125 }
|
126
127 private void thing() {
128 try {
|
129 Thread.sleep(6);
130 } catch (InterruptedException e) {
|
131 > throw new Error("Unexpected inturruption");
|
132 }
|
133 }
|
134 }
|