f42f14a9ca
2002-03-21 Andrew Haley <aph@redhat.com> * libjava.lang/Thread_Interrupt.java (Looper.calibrate): New. (yields): New. From-SVN: r51169
156 lines
3.2 KiB
Java
156 lines
3.2 KiB
Java
// Test interrupt() behaviour on a thread in wait(), sleep(), and spinning
|
|
// in a loop.
|
|
// Origin: Bryce McKinlay <bryce@albatross.co.nz>
|
|
|
|
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.");
|
|
}
|
|
}
|
|
}
|