In your application you may have a scenario where you spawn a bunch of threads to execute some logic and you want to
start any further processing only after all the threads have finished the execution. Which means you need some way to
know whether a thread is terminated or not. For that purpose Thread class provides isAlive()
and join()
methods in Java to check if a thread has finished executing or not.
isAlive() method in Java
This method tests if this thread is alive. A thread is alive if it has been started and has not yet died. Method returns true if thread is alive otherwise it returns false.
isAlive() method syntaxpublic final boolean isAlive()
join() method in Java
This method waits until the thread on which it is called terminates. There are three overloaded versions of join() method in Java Thread class.
- public final void join() throws InterruptedException- Waits indefinitely for this thread to die.
- public final void join(long millis) throws InterruptedException- Waits at most the time in milliseconds for this thread to die.
- public final void join(long millis, int nanos) throws InterruptedException- Waits at most the time in milliseconds plus additional time in nanoseconds for this thread to die.
isAlive() and join() method Java example
Here is an example where five threads are created and you want to ensure that any further processing is done only after all these five threads finish executing the run() method and all these five threads are terminated.
First we’ll see what happens if join() method is not used.
class MyRunnable implements Runnable{ @Override public void run() { System.out.println("In run method --" + Thread.currentThread().getName()); try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public class ThreadDemo { public static void main(String[] args) { Thread t1 = new Thread(new MyRunnable()); Thread t2 = new Thread(new MyRunnable()); Thread t3 = new Thread(new MyRunnable()); Thread t4 = new Thread(new MyRunnable()); Thread t5 = new Thread(new MyRunnable()); t1.start(); t2.start(); t3.start(); t4.start(); t5.start(); System.out.println("Is t1 Alive " + t1.isAlive()); System.out.println("Is t2 Alive " + t2.isAlive()); System.out.println("Is t3 Alive " + t3.isAlive()); System.out.println("Is t4 Alive " + t4.isAlive()); System.out.println("Is t5 Alive " + t5.isAlive()); System.out.println("Now start further processing"); } }Output
Is t1 Alive true Is t2 Alive true Is t3 Alive true Is t4 Alive true Is t5 Alive true Now start further processing In run method --Thread-1 In run method --Thread-0 In run method --Thread-2 In run method --Thread-3 In run method –Thread-4
As you can see from the output “Now start further processing” message is printed even before the threads started executing. But that is not what you want so let’s see how join() method can help in this scenario.
class MyRunnable implements Runnable{ @Override public void run() { System.out.println("In run method --" + Thread.currentThread().getName()); try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public class ThreadDemo { public static void main(String[] args) { Thread t1 = new Thread(new MyRunnable()); Thread t2 = new Thread(new MyRunnable()); Thread t3 = new Thread(new MyRunnable()); Thread t4 = new Thread(new MyRunnable()); Thread t5 = new Thread(new MyRunnable()); t1.start(); t2.start(); t3.start(); t4.start(); t5.start(); System.out.println("Is t1 Alive " + t1.isAlive()); System.out.println("Is t2 Alive " + t2.isAlive()); System.out.println("Is t3 Alive " + t3.isAlive()); System.out.println("Is t4 Alive " + t4.isAlive()); System.out.println("Is t5 Alive " + t5.isAlive()); try { t1.join(); t2.join(); t3.join(); t4.join(); t5.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("Is t1 Alive " + t1.isAlive()); System.out.println("Is t2 Alive " + t2.isAlive()); System.out.println("Is t3 Alive " + t3.isAlive()); System.out.println("Is t4 Alive " + t4.isAlive()); System.out.println("Is t5 Alive " + t5.isAlive()); System.out.println("Now start further processing"); } }Output
Is t1 Alive true In run method --Thread-2 In run method --Thread-0 In run method --Thread-3 Is t2 Alive true Is t3 Alive true Is t4 Alive true Is t5 Alive true In run method --Thread-4 In run method --Thread-1 Is t1 Alive false Is t2 Alive false Is t3 Alive false Is t4 Alive false Is t5 Alive false Now start further processing
As you can see “Now start further processing” message is now displayed only after all the five threads have finished executing. With isAlive() methods after the join() methods it can be verified that the threads are terminated.
That's all for the topic isAlive() And join() Methods in Java. If something is missing or you have something to share about the topic please write a comment.
You may also like
- Sleep Method in Java Multi-Threading
- Difference Between sleep() And wait() Methods in Java
- Thread Starvation in Java
- HashMap Internal Implementation in Java
- Checked Vs Unchecked Exception in Java
- Java switch case Statement With Examples
- Java Program to Swap Two Numbers Without Using Third Variable
- JShell in Java
- Setting Error Page (404 Page) in React Router
- Parquet File Format in Hadoop
No comments:
Post a Comment