isAlive( ) and join( )

Two ways exist to determine whether a thread has finished.

First, you can call isAlive( ) on the thread. This method is defined by Thread, and its general form is shown here:


final boolean isAlive( )

The isAlive( ) method returns true if the thread upon which it is called is still running. It returns false otherwise.

While isAlive( ) is useful, you can use join() to wait for a thread to finish, shown here:


final void join( ) throws InterruptedException

This method waits until the thread on which it is called terminates.

Additional forms of join( ) allow you to specify a maximum amount of time that you want to wait for the specified thread to terminate.

Here is an example that uses join( ) to ensure that the main thread is the last to stop. It also demonstrates the isAlive( ) method.


class NewThread implements Runnable {
  String name;
  Thread t;

  NewThread(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 Main {
  public static void main(String args[]) {
    NewThread ob1 = new NewThread("One");
    NewThread ob2 = new NewThread("Two");
    NewThread ob3 = new NewThread("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.");
  }
}

Joining the default main thread with a background thread


public class Main {
  public static void main(String[] args) {
    Runnable r = new Runnable() {
      @Override
      public void run() {
        System.out.println("sleeping for 5 seconds.");
        try {
          Thread.sleep(5000);
        } catch (Exception ie) {
        }
        System.out.println("Worker thread is done");
      }
    };
    Thread thd = new Thread(r);
    thd.start();
    System.out.println("main thread is running.");
    try {
      Thread.sleep(2000);
    } catch (InterruptedException ie) {
    }
    System.out.println("main thread is waiting for worker thread.");
    try {
      thd.join();
    } catch (InterruptedException ie) {
    }
  }
}
Home 
  Java Book 
    Thread Conncurrent  

Thread:
  1. Multithreaded Programming
  2. The Main Thread
  3. Thread Name
  4. Thread sleep
  5. Thread Creation
  6. isAlive( ) and join( )
  7. Thread Priorities
  8. Thread Synchronization
  9. Interthread Communication
  10. Suspending, Resuming, and Stopping Threads
  11. Handle Uncaught Exception
  12. ThreadLocal variables