import java.awt.*;
import java.applet.Applet;

public class ThreadJoinBug extends Applet implements Runnable {
  Button _startThreadButton;
  TextField _threadTimeToRun;
  TextField _threadTimeOut;
  TextField _timeWaited;
  int _timeToSleep = 100;

  public void init() { 
    setLayout(new BorderLayout());
  
    _startThreadButton = new Button("Start Running The Thread");
    add("Center",_startThreadButton);

    Panel insidePanel = new Panel();
    add("South",insidePanel);
    
    insidePanel.setLayout(new GridLayout(3,2));
    insidePanel.add(new Label("Time in ms for Thread to run:"));
    _threadTimeToRun = new TextField("2000");
    insidePanel.add(_threadTimeToRun);
    
    insidePanel.add(new Label("Time in ms before TimeOut:"));
    _threadTimeOut = new TextField("3000");
    insidePanel.add(_threadTimeOut);
   
    insidePanel.add(new Label("Time Join Waited:"));
    _timeWaited = new TextField("");
    insidePanel.add(_timeWaited);
         
  }

  private void startThreadClicked() {
    Thread t = new Thread(this);
    int timeOut = Integer.parseInt(_threadTimeOut.getText());
    long startTime = System.currentTimeMillis();
    _timeWaited.setText("");
    t.start();
    try {
      t.join(timeOut);
    } catch (InterruptedException e) {}
    long stopTime = System.currentTimeMillis();
    t.stop();
    _timeWaited.setText((new Integer((int)(stopTime-startTime))).toString());
  }

  public boolean handleEvent(Event event) {
    if (event.target == _startThreadButton && event.id == Event.ACTION_EVENT) {
      startThreadClicked();
      return true;
    }
    return super.handleEvent(event);
  }

  public void run() {
    int timeForThreadToRun = Integer.parseInt(_threadTimeToRun.getText());
    int timesToRun = timeForThreadToRun / _timeToSleep;
    System.out.println("Times To Run: " + 
      (new Integer(timesToRun)).toString());
    for (int i = 0; i < timesToRun; i++) {
      System.out.println( (new Integer(i * _timeToSleep)).toString());
      try {
        Thread.sleep(_timeToSleep);
      } catch (InterruptedException e) {}
    }
  } // End of run()


} // end of class