1 // Test interrupt() behaviour on a thread in wait(), sleep(), and spinning 2 // in a loop. 3 // Origin: Bryce McKinlay <bryce@albatross.co.nz> 4 5 class Waiter extends Thread 6 { run()7 public synchronized void run() 8 { 9 System.out.println ("wait()"); 10 try 11 { 12 wait(); 13 System.out.println("Error: wait() completed normally."); 14 } 15 catch (InterruptedException x) 16 { 17 if (isInterrupted() || interrupted()) 18 System.out.println("Error: interrupt flag is still set."); 19 20 } 21 System.out.println("interrupted - ok"); 22 } 23 } 24 25 class Sleeper extends Thread 26 { run()27 public void run() 28 { 29 System.out.println ("sleep()"); 30 try 31 { 32 sleep(2000); 33 System.out.println("Error: sleep() completed normally."); 34 } 35 catch (InterruptedException x) 36 { 37 if (isInterrupted() || interrupted()) 38 System.out.println("Error: interrupt flag is still set."); 39 40 System.out.println("interrupted - ok"); 41 } 42 } 43 } 44 45 class Looper extends Thread 46 { 47 // Return the number of Thread.yield()s we can do in 500ms. calibrate()48 static long calibrate () 49 { 50 long i = 1; 51 52 for (int tries = 0; tries < 40; tries++) 53 { 54 long t = System.currentTimeMillis(); 55 for (long n = 0; n < i; n++) 56 Thread.yield(); 57 long t_prime = System.currentTimeMillis(); 58 if (t_prime - t > 500) 59 return i; 60 i *= 2; 61 } 62 // We have no system clock. Give up. 63 throw new RuntimeException ("We have no system clock."); 64 } 65 66 static long yields = calibrate (); 67 run()68 public void run() 69 { 70 System.out.println ("Busy waiting"); 71 72 int count = 0; 73 for (long i=0; i < yields; i++) 74 { 75 Thread.yield(); 76 count += 5; 77 if (isInterrupted ()) 78 break; 79 } 80 synchronized (this) 81 { 82 if (interrupted ()) 83 { 84 System.out.println ("interrupted - ok"); 85 if (isInterrupted () || interrupted ()) 86 System.out.println("Error: interrupt flag is still set."); 87 } 88 else 89 System.out.println ("Error: Busy wait was not interrupted."); 90 } 91 } 92 } 93 94 class Joiner extends Thread 95 { run()96 public void run() 97 { 98 System.out.println("join()"); 99 try 100 { 101 join(2000); 102 System.out.println("Error: join() completed normally??!"); 103 } 104 catch (InterruptedException x) 105 { 106 if (isInterrupted() || interrupted()) 107 System.out.println("Error: interrupt flag is still set."); 108 109 System.out.println("interrupted - ok"); 110 } 111 112 } 113 } 114 115 public class Thread_Interrupt 116 { main(String args[])117 public static void main(String args[]) 118 { 119 Waiter w = new Waiter(); 120 w.start (); 121 sleep_and_interrupt (w); 122 123 Sleeper s = new Sleeper(); 124 s.start (); 125 sleep_and_interrupt (s); 126 127 Looper l = new Looper (); 128 l.start (); 129 sleep_and_interrupt (l); 130 131 Joiner j = new Joiner (); 132 j.start (); 133 sleep_and_interrupt (j); 134 } 135 sleep_and_interrupt(Thread t)136 public static void sleep_and_interrupt(Thread t) 137 { 138 try 139 { 140 Thread.sleep (250); 141 t.interrupt (); 142 long t1 = System.currentTimeMillis(); 143 t.join (5000); 144 long time = System.currentTimeMillis() - t1; 145 if (time > 2900) 146 { 147 System.out.println ("Error: join() from main thread timed out"); 148 } 149 } 150 catch (InterruptedException x) 151 { 152 System.out.println("Error: main thread interrupted."); 153 } 154 } 155 } 156