Mega Code Archive

 
Categories / Java Book / 007 Thread Conncurrent
 

0383 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) { } } }