blob: c2ea192e85f1d989339025e7f7c7a3ffef4b0823 [file] [log] [blame]
// Copyright 2006 The Android Open Source Project
/**
* Test synchronization primitives.
*
* TODO: this should be re-written to be a little more rigorous and/or
* useful. Also, the ThreadDeathHandler stuff should be exposed or
* split out.
*/
public class Main {
public static void main(String[] args) {
System.out.println("Sleep Test");
sleepTest();
System.out.println("\nCount Test");
countTest();
System.out.println("\nInterrupt Test");
interruptTest();
}
static void sleepTest() {
System.out.println("GOING");
try {
Thread.sleep(1000);
}
catch (InterruptedException ie) {
System.out.println("INTERRUPT!");
ie.printStackTrace();
}
System.out.println("GONE");
}
static void countTest() {
CpuThread one, two;
one = new CpuThread(1);
two = new CpuThread(2);
one.start();
two.start();
try {
Thread.sleep(100);
}
catch (InterruptedException ie) {
System.out.println("INTERRUPT!");
ie.printStackTrace();
}
//System.out.println("main: off and running");
try {
one.join();
two.join();
}
catch (InterruptedException ie) {
System.out.println("INTERRUPT!");
ie.printStackTrace();
}
System.out.println("main: all done");
}
static void interruptTest() {
SleepyThread sleepy, pesky;
sleepy = new SleepyThread(null);
pesky = new SleepyThread(sleepy);
sleepy.setPriority(4);
sleepy.start();
pesky.start();
pesky.setPriority(3);
}
}
class CpuThread extends Thread {
static Object mSyncable = new Object();
static int mCount = 0;
int mNumber;
CpuThread(int num) {
super("CpuThread " + num);
mNumber = num;
}
public void run() {
//System.out.print("thread running -- ");
//System.out.println(Thread.currentThread().getName());
for (int i = 0; i < 10; i++) {
output(mNumber);
}
System.out.print("Final result: ");
System.out.println(mCount);
}
void output(int num) {
/*
* Delete the next line; last "final result" should != 20.
*/
synchronized (mSyncable)
{
int i, count;
count = mCount;
System.out.print("going: ");
System.out.println(num);
/* burn CPU; adjust end value so we exceed scheduler quantum */
for (int j = 0; j < 5000; j++)
;
count++;
mCount = count;
}
}
}
class SleepyThread extends Thread {
private SleepyThread mOther;
private Integer[] mWaitOnMe; // any type of object will do
private static int count = 0;
SleepyThread(SleepyThread other) {
mOther = other;
mWaitOnMe = new Integer[] { 1, 2 };
setName("thread#" + count);
count++;
}
public void run() {
System.out.println("SleepyThread.run starting");
if (false) {
ThreadDeathHandler threadHandler =
new ThreadDeathHandler("SYNC THREAD");
Thread.currentThread().setUncaughtExceptionHandler(threadHandler);
throw new NullPointerException("die");
}
if (mOther == null) {
boolean intr = false;
try {
synchronized (mWaitOnMe) {
mWaitOnMe.wait(9000);
}
}
catch (InterruptedException ie) {
// Expecting this; interrupted should be false.
System.out.println(Thread.currentThread().getName() +
" interrupted, flag=" + Thread.interrupted());
intr = true;
}
catch (Exception ex) {
ex.printStackTrace();
}
if (!intr)
System.out.println("NOT INTERRUPTED");
} else {
try {
Thread.sleep(2000);
}
catch (InterruptedException ie) {
System.out.println("PESKY INTERRUPTED?");
}
System.out.println("interrupting other (isAlive="
+ mOther.isAlive() + ")");
mOther.interrupt();
}
}
}