mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			145 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Java
		
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Java
		
	
	
	
// Create many threads waiting on a monitor. Interrupt some of them. Do the 
 | 
						|
// others wake up correctly with notify() and/or notifyAll()?
 | 
						|
// Origin: Bryce McKinlay <bryce@albatross.co.nz>
 | 
						|
 | 
						|
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.");
 | 
						|
      }
 | 
						|
  }
 | 
						|
  
 | 
						|
}
 |