// Fig. 13.3: PrintTest.java
// Show multiple threads printing at different intervals.

public class PrintTest {
   public static void main( String args[] )
   {
      PrintThread thread1, thread2, thread3, thread4;

      thread1 = new PrintThread();
      thread2 = new PrintThread();
      thread3 = new PrintThread();
      thread4 = new PrintThread();

      thread1.start();
      thread2.start();
      thread3.start();
      thread4.start();
   }
}

class PrintThread extends Thread {
   int sleepTime;

   // PrintThread constructor assigns name to thread 
   // by calling Thread constructor
   public PrintThread()
   {
      // sleep between 0 and 5 seconds
      sleepTime = (int) ( Math.random() * 5000 );

      System.out.println( "Name: " + getName() +
                          ";  sleep: " + sleepTime );
   }

   // execute the thread
   public void run()
   {
      // put thread to sleep for a random interval
      try {
         Thread.sleep( sleepTime );
      }
      catch ( InterruptedException exception ) {
         System.err.println( exception.toString() );
      }

      // print thread name
      System.out.println( getName() );                             
   }
}
