Threads Java

public class JoinDemo extends Object {
  public static Thread createThread(String name, long napTime) {
    final long sleepTime = napTime;
    Runnable r = new Runnable() {
        public void run() {
          try {
            print("in run() - entering");
            Thread.sleep(sleepTime);
          } catch ( InterruptedException x ) {
            print("interrupted!");
          } finally {
            print("in run() - leaving");
          }
        }
      };
  
    Thread t = new Thread(r, name);
    t.start();
    return t;
  }
  private static void print(String msg) {
    String name = Thread.currentThread().getName();
    System.out.println(name + ": " + msg);
  }
  public static void main(String[] args) {
    Thread[] t = new Thread[3];
    t[0] = createThread("thread A", 2000);
    t[1] = createThread("thread B", 1000);
    t[2] = createThread("thread C", 3000);
    for ( int i = 0; i < t.length; i++ ) {
      try {
        String idxStr = "thread[" + i + "]";
        String name = "[" + t[i].getName() + "]";
        print(idxStr + ".isAlive()=" + 
            t[i].isAlive() + " " + name);
        print("about to do: " + idxStr + 
            ".join() " + name);
        long start = System.currentTimeMillis();
        t[i].join(); // wait for the thread to die
        long stop = System.currentTimeMillis();
        print(idxStr + ".join() - took " + 
            ( stop - start ) + " ms " + name);
      } catch ( InterruptedException x ) {
        print("interrupted waiting on #" + i);
      }
    }
  }
}