// 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.");
      }
  }
  
}
