/* 
 * Output: 
New thread: Thread[One,5,main] 
New thread: Thread[Two,5,main] 
New thread: Thread[Three,5,main] 
Two: 5 
Thread One is alive: true 
Thread Two is alive: true 
Thread Three is alive: true 
Waiting for threads to finish. 
One: 5 
Three: 5 
Two: 4 
Three: 4 
One: 4 
One: 3 
Three: 3 
Two: 3 
One: 2 
... 
...   
 */ 
 
class MyThread implements Runnable { 
  String name; // name of thread 
 
  Thread t; 
 
  MyThread(String threadname) { 
    name = threadname; 
    t = new Thread(this, name); 
    System.out.println("New thread: " + t); 
    t.start(); 
  } 
 
  public void run() { 
    try { 
      for (int i = 5; i > 0; i--) { 
        System.out.println(name + ": " + i); 
        Thread.sleep(1000); 
      } 
    } catch (InterruptedException e) { 
      System.out.println(name + " interrupted."); 
    } 
    System.out.println(name + " exiting."); 
  } 
} 
 
public class MainClass { 
  public static void main(String args[]) { 
    MyThread ob1 = new MyThread("One"); 
    MyThread ob2 = new MyThread("Two"); 
    MyThread ob3 = new MyThread("Three"); 
 
    System.out.println("Thread One is alive: " + ob1.t.isAlive()); 
    System.out.println("Thread Two is alive: " + ob2.t.isAlive()); 
    System.out.println("Thread Three is alive: " + ob3.t.isAlive()); 
 
    try { 
      System.out.println("Waiting for threads to finish."); 
      ob1.t.join(); 
      ob2.t.join(); 
      ob3.t.join(); 
    } catch (InterruptedException e) { 
      System.out.println("Main thread Interrupted"); 
    } 
 
    System.out.println("Thread One is alive: " + ob1.t.isAlive()); 
    System.out.println("Thread Two is alive: " + ob2.t.isAlive()); 
    System.out.println("Thread Three is alive: " + ob3.t.isAlive()); 
 
    System.out.println("Main thread exiting."); 
  } 
} 
            
          
     
  
  |