// Test interrupt() behaviour on a thread in wait(), sleep(), and spinning // in a loop. class ThreadBase extends Thread { boolean ready = false; synchronized void ready() { ready = true; } } class Waiter extends ThreadBase { public synchronized void run() { super.ready(); 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 ThreadBase { public void run() { super.ready(); System.out.println ("sleep()"); try { sleep(5000); 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 ThreadBase { public void run() { super.ready(); System.out.println ("Busy waiting"); int count = 0; long start = System.currentTimeMillis(); while (true) { Thread.yield(); if (isInterrupted ()) break; long now = System.currentTimeMillis(); if ((now - start) > 5000) 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 ThreadBase { public void run() { super.ready(); 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(ThreadBase t) { try { synchronized (t) { while (!t.ready) t.wait(10); } Thread.sleep (50); 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."); } } }