public class SimpleThreads {
  public static void main(String args[]) throws InterruptedException {
    //Delay, in milliseconds before we interrupt MessageLoop
    //thread (default one hour).
    long patience = 1000 * 60 * 60;

    //If command line argument present, gives patience in seconds.
    if (args.length > 0) {
        patience = Long.parseLong(args[0]) * 1000;
    }

    MessageLoop.threadMessage("Starting MessageLoop thread");
    long startTime = System.currentTimeMillis();
    Thread t = new Thread(new MessageLoop());
    t.start();

    MessageLoop.threadMessage("Waiting for MessageLoop thread to finish");
    //loop until MessageLoop thread exits
    while (t.isAlive()) {
      MessageLoop.threadMessage("Still waiting...");
      //Wait maximum of 1 second for MessageLoop thread to
      //finish.
      t.join(1000);
      if (((System.currentTimeMillis() - startTime) > patience) &&
          t.isAlive()) {
        MessageLoop.threadMessage("Tired of waiting!");
        t.interrupt();
        //Shouldn't be long now -- wait indefinitely
        t.join();
      }
    }
    MessageLoop.threadMessage("Finally!");
  }
}
