blob: c2ea192e85f1d989339025e7f7c7a3ffef4b0823 [file] [log] [blame]
jeffhao5d1ac922011-09-29 17:41:15 -07001// Copyright 2006 The Android Open Source Project
2
3/**
4 * Test synchronization primitives.
5 *
6 * TODO: this should be re-written to be a little more rigorous and/or
7 * useful. Also, the ThreadDeathHandler stuff should be exposed or
8 * split out.
9 */
10public class Main {
11 public static void main(String[] args) {
12 System.out.println("Sleep Test");
13 sleepTest();
14
15 System.out.println("\nCount Test");
16 countTest();
17
18 System.out.println("\nInterrupt Test");
19 interruptTest();
20 }
21
22 static void sleepTest() {
23 System.out.println("GOING");
24 try {
25 Thread.sleep(1000);
26 }
27 catch (InterruptedException ie) {
28 System.out.println("INTERRUPT!");
29 ie.printStackTrace();
30 }
31 System.out.println("GONE");
32 }
33
34 static void countTest() {
35 CpuThread one, two;
36
37 one = new CpuThread(1);
38 two = new CpuThread(2);
39
40 one.start();
41 two.start();
42
43 try {
44 Thread.sleep(100);
45 }
46 catch (InterruptedException ie) {
47 System.out.println("INTERRUPT!");
48 ie.printStackTrace();
49 }
50
51 //System.out.println("main: off and running");
52
53 try {
54 one.join();
55 two.join();
56 }
57 catch (InterruptedException ie) {
58 System.out.println("INTERRUPT!");
59 ie.printStackTrace();
60 }
61 System.out.println("main: all done");
62 }
63
64 static void interruptTest() {
65 SleepyThread sleepy, pesky;
66
67 sleepy = new SleepyThread(null);
68 pesky = new SleepyThread(sleepy);
69
70 sleepy.setPriority(4);
71 sleepy.start();
72 pesky.start();
73 pesky.setPriority(3);
74 }
75}
76
77class CpuThread extends Thread {
78 static Object mSyncable = new Object();
79 static int mCount = 0;
80 int mNumber;
81
82 CpuThread(int num) {
83 super("CpuThread " + num);
84 mNumber = num;
85 }
86
87 public void run() {
88 //System.out.print("thread running -- ");
89 //System.out.println(Thread.currentThread().getName());
90
91 for (int i = 0; i < 10; i++) {
92 output(mNumber);
93 }
94
95 System.out.print("Final result: ");
96 System.out.println(mCount);
97 }
98
99 void output(int num) {
100 /*
101 * Delete the next line; last "final result" should != 20.
102 */
103 synchronized (mSyncable)
104 {
105 int i, count;
106
107 count = mCount;
108
109 System.out.print("going: ");
110 System.out.println(num);
111
112 /* burn CPU; adjust end value so we exceed scheduler quantum */
113 for (int j = 0; j < 5000; j++)
114 ;
115
116 count++;
117 mCount = count;
118 }
119 }
120}
121
122class SleepyThread extends Thread {
123 private SleepyThread mOther;
124 private Integer[] mWaitOnMe; // any type of object will do
125
126 private static int count = 0;
127
128 SleepyThread(SleepyThread other) {
129 mOther = other;
130 mWaitOnMe = new Integer[] { 1, 2 };
131
132 setName("thread#" + count);
133 count++;
134 }
135
136 public void run() {
137 System.out.println("SleepyThread.run starting");
138
139 if (false) {
140 ThreadDeathHandler threadHandler =
141 new ThreadDeathHandler("SYNC THREAD");
142 Thread.currentThread().setUncaughtExceptionHandler(threadHandler);
143 throw new NullPointerException("die");
144 }
145
146 if (mOther == null) {
147 boolean intr = false;
148
149 try {
150 synchronized (mWaitOnMe) {
151 mWaitOnMe.wait(9000);
152 }
153 }
154 catch (InterruptedException ie) {
155 // Expecting this; interrupted should be false.
156 System.out.println(Thread.currentThread().getName() +
157 " interrupted, flag=" + Thread.interrupted());
158 intr = true;
159 }
160 catch (Exception ex) {
161 ex.printStackTrace();
162 }
163
164 if (!intr)
165 System.out.println("NOT INTERRUPTED");
166 } else {
167 try {
168 Thread.sleep(2000);
169 }
170 catch (InterruptedException ie) {
171 System.out.println("PESKY INTERRUPTED?");
172 }
173
174 System.out.println("interrupting other (isAlive="
175 + mOther.isAlive() + ")");
176 mOther.interrupt();
177 }
178 }
179}