Thread join and is alive

In this chapter you will learn:

  1. How to use isAlive() and join()
  2. How to join the background thread

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;/* j  a va 2s  .  c  o  m*/
  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.");
  }
}

Join the background thread

The following code shows hwo to join the default main thread with a background thread.

public class Main {
  public static void main(String[] args) {
    Runnable r = new Runnable() {
      @Override/* ja va2s.  c  o m*/
      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) {
    }
  }
}

Next chapter...

What you will learn in the next chapter:

  1. How to control Thread priorities
  2. Access Thread.MIN_PRIORITY vs Thread.MAX_PRIORITY
Home » Java Tutorial » Thread
Thread introduction
Thread Name
Thread Main
Thread sleep
Thread Creation
Thread join and is alive
Thread priorities
Thread Synchronization
Interthread Communication
Thread Step
Thread suspend, resume, and stop
ThreadGroup
BlockingQueue
Semaphore
ReentrantLock
Executor
ScheduledThreadPoolExecutor