| /* |
| * Copyright (C) 2006 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /** |
| * 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); |
| } |
| System.out.println("GONE"); |
| } |
| |
| static void countTest() { |
| CpuThread one, two; |
| |
| one = new CpuThread(1); |
| two = new CpuThread(2); |
| |
| synchronized (one) { |
| one.start(); |
| try { |
| one.wait(); |
| } catch (InterruptedException ie) { |
| System.out.println("INTERRUPT!"); |
| ie.printStackTrace(System.out); |
| } |
| } |
| |
| two.start(); |
| |
| //System.out.println("main: off and running"); |
| |
| try { |
| one.join(); |
| two.join(); |
| } catch (InterruptedException ie) { |
| System.out.println("INTERRUPT!"); |
| ie.printStackTrace(System.out); |
| } |
| 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()); |
| |
| synchronized (mSyncable) { |
| synchronized (this) { |
| this.notify(); |
| } |
| for (int i = 0; i < 10; i++) { |
| output(mNumber); |
| } |
| |
| System.out.print("Final result: "); |
| System.out.println(mCount); |
| } |
| } |
| |
| void output(int num) { |
| int 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 volatile boolean otherDone; |
| |
| private static int count = 0; |
| |
| SleepyThread(SleepyThread other) { |
| mOther = other; |
| otherDone = false; |
| 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 { |
| do { |
| synchronized (mWaitOnMe) { |
| mWaitOnMe.wait(9000); |
| } |
| } while (!otherDone); |
| } 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(System.out); |
| } |
| |
| 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(); |
| mOther.otherDone = true; |
| } |
| } |
| } |