// Test interrupt() behaviour on a thread in wait(), sleep(), and spinning // in a loop. // Origin: Bryce McKinlay class Waiter extends Thread { public synchronized void run() { System.out.println ("wait()"); try { wait(); System.out.println("Error: wait() completed normally."); } catch (InterruptedException x) { if (isInterrupted() || interrupted()) System.out.println("Error: interrupt flag is still set."); } System.out.println("interrupted - ok"); } } class Sleeper extends Thread { public void run() { System.out.println ("sleep()"); try { sleep(2000); System.out.println("Error: sleep() completed normally."); } catch (InterruptedException x) { if (isInterrupted() || interrupted()) System.out.println("Error: interrupt flag is still set."); System.out.println("interrupted - ok"); } } } class Looper extends Thread { // Return the number of Thread.yield()s we can do in 500ms. static long calibrate () { long i = 1; for (int tries = 0; tries < 40; tries++) { long t = System.currentTimeMillis(); for (long n = 0; n < i; n++) Thread.yield(); long t_prime = System.currentTimeMillis(); if (t_prime - t > 500) return i; i *= 2; } // We have no system clock. Give up. throw new RuntimeException ("We have no system clock."); } static long yields = calibrate (); public void run() { System.out.println ("Busy waiting"); int count = 0; for (long i=0; i < yields; i++) { Thread.yield(); count += 5; if (isInterrupted ()) break; } synchronized (this) { if (interrupted ()) { System.out.println ("interrupted - ok"); if (isInterrupted () || interrupted ()) System.out.println("Error: interrupt flag is still set."); } else System.out.println ("Error: Busy wait was not interrupted."); } } } class Joiner extends Thread { public void run() { System.out.println("join()"); try { join(2000); System.out.println("Error: join() completed normally??!"); } catch (InterruptedException x) { if (isInterrupted() || interrupted()) System.out.println("Error: interrupt flag is still set."); System.out.println("interrupted - ok"); } } } public class Thread_Interrupt { public static void main(String args[]) { Waiter w = new Waiter(); w.start (); sleep_and_interrupt (w); Sleeper s = new Sleeper(); s.start (); sleep_and_interrupt (s); Looper l = new Looper (); l.start (); sleep_and_interrupt (l); Joiner j = new Joiner (); j.start (); sleep_and_interrupt (j); } public static void sleep_and_interrupt(Thread t) { try { Thread.sleep (250); t.interrupt (); long t1 = System.currentTimeMillis(); t.join (5000); long time = System.currentTimeMillis() - t1; if (time > 2900) { System.out.println ("Error: join() from main thread timed out"); } } catch (InterruptedException x) { System.out.println("Error: main thread interrupted."); } } }