mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-11-29 05:09:58 +08:00
ce961468b7
2004-07-27 Bryce McKinlay <mckinlay@redhat.com> * testsuite/libjava.lang/TLtest.java: Reduce sleep time. * testsuite/libjava.lang/Thread_Alive.java: Remove old email address. Reduce sleep time. * testsuite/libjava.lang/Thread_HoldsLock.java: Modify to work around compiler bug. * testsuite/libjava.lang/Thread_Interrupt.java: Remove old email address. Reduce sleep times. Synchronize with target threads before attempting to interrupt them. Don't try to calibrate yeild count, instead, always loop for a fixed time. * testsuite/libjava.lang/Thread_Join.java: Remove old email address. * testsuite/libjava.lang/Thread_Monitor.java: Likewise. * testsuite/libjava.lang/Thread_Wait.java: Likewise. * testsuite/libjava.lang/Thread_Wait_2.java: Likewise. * testsuite/libjava.lang/Thread_Wait_Interrupt.java: Likewise. * testsuite/libjava.lang/pr179.java: Likewise. * testsuite/libjava.lang/Thread_Sleep.java: Likewise. Reduce sleep time. Remove upper bounds check on sleep time. From-SVN: r85248
144 lines
2.6 KiB
Java
144 lines
2.6 KiB
Java
// Create many threads waiting on a monitor. Interrupt some of them. Do the
|
|
// others wake up correctly with notify() and/or notifyAll()?
|
|
|
|
import java.util.Vector;
|
|
|
|
class Waiter extends Thread
|
|
{
|
|
Object monitor;
|
|
int thread_num;
|
|
boolean interrupted = false;
|
|
boolean notified = false;
|
|
|
|
Waiter (Object monitor, int thread_num)
|
|
{
|
|
this.monitor = monitor;
|
|
this.thread_num = thread_num;
|
|
}
|
|
|
|
public void run()
|
|
{
|
|
synchronized (monitor)
|
|
{
|
|
try
|
|
{
|
|
monitor.wait();
|
|
notified = true;
|
|
}
|
|
catch (InterruptedException x)
|
|
{
|
|
interrupted = true;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
public class Thread_Wait_2
|
|
{
|
|
static Vector threads;
|
|
static Object monitor = new Object();
|
|
|
|
static final int NUM_THREADS = 10;
|
|
|
|
public static void main(String args[])
|
|
{
|
|
|
|
|
|
try
|
|
{
|
|
makeThreads ();
|
|
|
|
Thread.sleep(250);
|
|
|
|
// Interrupt a few threads...
|
|
Waiter i1 = (Waiter) threads.elementAt(3);
|
|
Waiter i2 = (Waiter) threads.elementAt(4);
|
|
Waiter i3 = (Waiter) threads.elementAt(9);
|
|
i1.interrupt();
|
|
i2.interrupt();
|
|
i3.interrupt();
|
|
|
|
// Call notify the exact number of times required to wake the remaining
|
|
// threads.
|
|
synchronized (monitor)
|
|
{
|
|
for (int i=0; i < NUM_THREADS -3 ; i++)
|
|
{
|
|
monitor.notify ();
|
|
}
|
|
}
|
|
|
|
joinAll();
|
|
printStatus();
|
|
|
|
// Repeat all the above, but use notifyAll() instead.
|
|
makeThreads();
|
|
|
|
Thread.sleep(250);
|
|
|
|
// Interrupt a few threads...
|
|
i1 = (Waiter) threads.elementAt(0);
|
|
i2 = (Waiter) threads.elementAt(1);
|
|
i3 = (Waiter) threads.elementAt(9);
|
|
i1.interrupt();
|
|
i2.interrupt();
|
|
i3.interrupt();
|
|
|
|
// Call notifyAll to wake the remaining threads.
|
|
synchronized (monitor)
|
|
{
|
|
monitor.notifyAll ();
|
|
}
|
|
|
|
joinAll();
|
|
printStatus();
|
|
|
|
}
|
|
catch (InterruptedException x)
|
|
{
|
|
System.out.println (x);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
static void makeThreads()
|
|
{
|
|
threads = new Vector(NUM_THREADS);
|
|
|
|
for (int i=0; i < NUM_THREADS; i++)
|
|
{
|
|
Waiter w = new Waiter(monitor, i);
|
|
w.start();
|
|
threads.addElement(w);
|
|
}
|
|
}
|
|
|
|
static void joinAll()
|
|
{
|
|
try
|
|
{
|
|
for (int i=0; i < threads.size(); i++)
|
|
{
|
|
Thread t = (Thread) threads.elementAt(i);
|
|
t.join();
|
|
}
|
|
}
|
|
catch (InterruptedException x) {}
|
|
}
|
|
|
|
static void printStatus()
|
|
{
|
|
for (int i=0; i < threads.size(); i++)
|
|
{
|
|
Waiter w = (Waiter) threads.elementAt(i);
|
|
if (w.interrupted)
|
|
System.out.println (i + " interrupted.");
|
|
if (w.notified)
|
|
System.out.println (i + " notified.");
|
|
}
|
|
}
|
|
|
|
}
|